Angular 11如何使用反应式表单验证confirmPassword与密码相同

qi *_*eng 5 angular angular-reactive-forms angular-forms

import { Component, OnInit } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';

@Component({
  selector: 'app-user-register',
  templateUrl: './user-register.component.html',
  styleUrls: ['./user-register.component.css']
})
export class UserRegisterComponent implements OnInit {

  registerationForm: FormGroup = new FormGroup({});
  constructor() { }

  ngOnInit() {
    this.registerationForm = new FormGroup({
      userName : new FormControl(null, Validators.required),
      email : new FormControl(null, [Validators.required, Validators.email]),
      password : new FormControl(null, [Validators.required, Validators.minLength(8)]),
      confirmPassword : new FormControl(null, [Validators.required]),
      mobile : new FormControl(null, [Validators.required, Validators.minLength(10)])
    }, this.passwordMatchingValidatior);
  }
  passwordMatchingValidatior(fg: FormGroup): Validators{
    return this.registerationForm.get('password').value === this.registerationForm.get('confirmPassword').value ? null : {notmatched: true};
  }
  onSubmit(){
    console.log(this.registerationForm);
  }
}
Run Code Online (Sandbox Code Playgroud)

错误消息 错误:src/app/user/user-register/user-register.component.ts:24:5 - 错误 TS2322:类型 '{ notmatched: boolean; } | null' 不可分配给类型'Validators'。类型“null”不可分配给类型“Validators”。

24 返回 this.registerationForm.get('password').value === this.registerationForm.get('confirmPassword').value ?null : {不匹配: true};

错误:src/app/user/user-register/user-register.component.ts:24:61 - 错误 TS2531:对象可能为“null”。

24 返回 this.registerationForm.get('password').value === this.registerationForm.get('confirmPassword').value ?null : {不匹配: true};

小智 11

根据角度文档 - 添加交叉验证到反应形式

创建你的验证器

export const passwordMatchingValidatior: ValidatorFn = (control: AbstractControl): ValidationErrors | null => {
  const password = control.get('password');
  const confirmPassword = control.get('confirmPassword');

  return password?.value === confirmPassword?.value ? null : { notmatched: true };
};

Run Code Online (Sandbox Code Playgroud)

并更新表单组验证器

this.registerationForm = new FormGroup({
      userName: new FormControl(null, Validators.required),
      email: new FormControl(null, [Validators.required, Validators.email]),
      password: new FormControl(null, [Validators.required, Validators.minLength(8)]),
      confirmPassword: new FormControl(null, [Validators.required]),
      mobile: new FormControl(null, [Validators.required, Validators.minLength(10)])
    }, { validators: passwordMatchingValidatior });
Run Code Online (Sandbox Code Playgroud)