问题描述
错误:预期的验证程序返回Promise或Observable。
我正在尝试工作的代码:
验证器:
export function passwordMatchValidator(passwordKey: string,passwordConfirmationKey: string,group: FormGroup): any {
if (group) {
if (group.get(passwordKey).value !== group.get(passwordConfirmationKey).value) {
return { 'passwordMismatch': true };
}
}
return null
}
FormGroup 代码:
this.formGroup.setValidators(passwordMatchValidator("password","confirmPassword",this.formGroup));
this.formGroup.updateValueAndValidity();
HTML :
<mat-error *ngIf="formGroup.controls['confirmPassword'].errors?.passwordMismatch"></mat-error>
解决方法
我创建了一个简单的Stackblitz示例。
formGroup
this.formGroup = new FormGroup(
{
password: new FormControl(),passwordConfirm: new FormControl()
},{ validators: passwordMatchValidator }
);
验证器
export function passwordMatchValidator(g: FormGroup) {
return g.get("password").value === g.get("passwordConfirm").value
? null
: { mismatch: true };
}
HTML
<form [formGroup]="formGroup" (ngSubmit)="onSubmit()">
Password: <input formControlName="password" placeholder="Password"><br>
Confirm Password: <input formControlName="passwordConfirm" placeholder="Confirm Password"><br>
<span *ngIf="formGroup.errors && formGroup.errors.mismatch"
[style.color]="'red'">Password Mismatch</span><br>
<button type="submit">Submit</button>
</form>
,
通过导入 ValidationErrors 来解决此问题,如下所示:
export function passwordMatchValidator(passwordKey: string,passwordConfirmationKey: string): ValidatorFn {
return (group: FormGroup): ValidationErrors => {
const control = group.controls[passwordKey];
const matchingControl = group.controls[passwordConfirmationKey];
if (matchingControl.errors && !matchingControl.errors.passwordMismatch) {
// return if another validator has already found an error on the matchingControl
return;
}
// set error on matchingControl if validation fails
if (control.value !== matchingControl.value) {
matchingControl.setErrors({ 'passwordMismatch': true});
} else {
matchingControl.setErrors(null);
}
return;
}
}