我创建了一个自定义验证器来验证确认密码输入是否与原始输入匹配。它运行良好。但是,我允许两个字段都为空,因为这是在用户设置中更改密码的页面上,他们可能不想这样做。如果两个字段都为空,则表单应该变为有效状态,以便可以提交并更新其个人资料的其他设置,但发生了一些奇怪的事情。
表单属性:
passControl = new FormControl('', [
FormValidation.checkPasswordStrength()
]);
passConfirmControl = new FormControl('', [
]);
profileForm = new FormGroup(
{
password: this.passControl,
passwordConfirm: this.passConfirmControl
},
{
validators: FormValidation.checkPasswordsMatch()
}
);
这是我的验证函数:
static checkPasswordsMatch(): ValidatorFn {
return (control: AbstractControl): {[key: string]: any} => {
let passwordCtrl = control.get('password');
let passwordConfirmCtrl = control.get('passwordConfirm');
// allow blank for when they don't want to change password
if (passwordCtrl.value === '' && passwordConfirmCtrl.value === '') {
console.log('both are blank');
return null;
}
if (passwordCtrl.value !== passwordConfirmCtrl.value) {
console.log('hit mismatch passwords');
control.get('passwordConfirm').setErrors( { passwordMatch: true } );
}
return null;
};
}
因此,当表单加载时,它实际上是有效的,我看到两个都是空的
。但是,如果您触摸密码字段并键入某些内容,当然它会显示它们不匹配,但是当您删除在那里键入的内容时,函数会显示它们再次都为空,但错误仍然存在,除非您还触摸密码确认字段并且也键入并删除一些内容。我错过了什么?
setErrors(null)
就可以解决问题! - Aaron HazeltonpasswordsDoNotMatch: null
以使其消失。此外,如果答案足够满意并/或彻底解决了问题,您会想要将其标记为答案,以让社区知道已经得到了回答。这也会给回答者声誉积分,这是回答问题的激励之一 :) - joshrathke