【发布时间】:2020-07-30 23:08:26
【问题描述】:
我有一个标准的更改密码页面,所以你输入旧密码,然后输入新密码,最后重复新密码。
在“new password”上,我有多个自定义验证器,我还需要一个来检查“new password”是否等于“old password”。
但是我当然不能从FormControl 做到这一点,因为我无法访问“old password”FormControl,所以我需要在FormGroup 上进行验证。
但是发生的情况是,当它在FormGroup 上验证这部分时,突然“new password”FormControl 上的所有验证器都被触发!!
有什么原因吗?
this.myForm = this.formBuilder.group(
{
oldPassword: [
"",
{
validators: [Validators.required],
],
newPassword: [
"",
Validators.compose([
Validators.required,
CustomValidators.patternValidator(/\d/, { hasNumber: true }),
CustomValidators.patternValidator(/[A-Z]/, {
hasCapitalCase: true,
}),
CustomValidators.patternValidator(/[a-z]/, { hasSmallCase: true }),
CustomValidators.patternValidator(
/[ !@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/,
{ hasSpecialCharacters: true }
),
Validators.minLength(8),
]),
],
confirmNewPassword: ["", Validators.compose([Validators.required])],
},
{ validators: [CustomValidators.passwordMatchValidator] }
);
}
我的自定义passwordMatchValidator:
static passwordMatchValidator(control: AbstractControl) {
const password: string = control.get("newPassword").value;
const confirmPassword: string = control.get("confirmNewPassword").value;
const oldPassword: string = control.get("oldPassword").value;
if (password !== confirmPassword) {
control.get("confirmNewPassword").setErrors({ NoPassswordMatch: true });
}
if (password === oldPassword) {
control.get("newPassword").setErrors({ OldPasswordMatch: true });
}
}
所以基本上,如果这个 FormGroup 验证器触发了“OldPasswordMatch”错误,那么突然间,newPassword FormControl 上的所有特定验证器都会被触发,这是为什么呢?
我无法将此验证放在FormControl“new password”上,因为它无法访问FormControl“old password”
【问题讨论】:
-
不确定您在这里想说什么。除非您设置不同的
updateOn选项,否则表单控件/组上的所有验证器都会一直被评估。无论您在表单组级别做什么。如果表单控件被标记为必需,如果它没有值,它将被标记为无效,并且无论如何都会被标记为具有必需的错误 -
我要告诉你的是,直到我在 passwordMatchValidator (检查密码 === oldPassword 的那个)上添加第二部分之前,只要添加这两个密码,一切都会正常工作匹配时,不仅会触发验证错误,还会触发上述 FormControl 验证的所有错误,例如 Validators.minLength(8) 将触发,即使匹配的密码只有 2 个字符!为什么会这样?
-
触发是因为你的密码只有2个字符,最小长度是8??
标签: angular validation