【发布时间】:2021-07-25 17:14:54
【问题描述】:
我编写了一个简单的自定义验证器来比较两个密码字段并在它们不匹配时发出错误信号。这里是:
@Directive({
selector: '[appMatchPassword]',
providers: [
{ provide: NG_VALIDATORS, useExisting: MatchPasswordDirective, multi: true }
]
})
export class MatchPasswordDirective implements Validator {
@Input('appMatchPassword') otherControl: string = '';
constructor() { }
registerOnValidatorChange(fn: () => void): void {
}
validate(control: AbstractControl): ValidationErrors | null {
const compareTo = control.parent?.get(this.otherControl);
if (!compareTo) return null;
if (compareTo?.value !== control.value) return {
appMatchPassword: true
}
return null;
}
}
模板这样引用它:
<mat-form-field>
<mat-label>Password</mat-label>
<input matInput type="password" name="password" [(ngModel)]="user.password"
required minlength="4" #iPassword="ngModel">
<mat-error *ngIf="iPassword.errors?.required">Password Required.</mat-error>
<mat-error *ngIf="iPassword.errors?.minlength">Minimum 4 characters</mat-error>
</mat-form-field>
<mat-form-field>
<mat-label>Verify Password</mat-label>
<input matInput type="password" name="vpassword" [(ngModel)]="vpassword"
required appMatchPassword="password" #fvp="ngModel">
<mat-error *ngIf="fvp.errors?.appMatchPassword">Passwords do not match</mat-error>
</mat-form-field>
如果用户在password 字段中输入一个值,在vpassword 字段中输入一个不同的值,这将按需要工作。如果用户更正了vpassword 字段中的值,错误就会显示出来并消失。
但是,如果用户返回并编辑 password 字段,错误不会消失。验证器仅在其自己的 AbstractControl 更改值后才被调用。
当password 字段发生变化时,有什么好的方法可以触发验证器吗?
【问题讨论】:
-
这能回答你的问题吗? Confirm password validation in Angular 6
-
@Yasser 是的。如果我第一次看到,我就不会发布这个问题。但是,我认为 Aviad 下面的答案更新颖、更简洁,因此我将其标记为答案,希望它能对下一个人有所帮助。
标签: angular