Angular 当 FormGroup 出现新错误时,反应式表单不会更新
Angular Reactive form not updating when FormGroup has new error
所以我在 ngOnInit() 中声明了我的 FormGroup 并调用了我的验证器函数以确保密码和 confirmPassword 字段如此匹配
我的打字稿
regForm: FormGroup;
constructor() { }
ngOnInit() {
this.regForm = new FormGroup({
userName: new FormControl('Mark', 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.passwordMatchingValid);
}
// validators return null if the condition is valid and a json object {key: value} if condition is false
passwordMatchingValid(fg: FormGroup) : Validators
{
return fg.get('password').value === fg.get('confirmPassword').value ? null :
{
// {key : value}
notmatched: true
};
}
所有字段也都有自己的 getter 方法,除一件事外一切正常。当密码不匹配时,我的确认密码字段似乎永远不会识别满足的条件,如果该字段中没有任何内容,他们会抱怨,因为它是必需的,但是只要我在输入中添加一个值,错误消息就会消失并且它没有像它应该的那样触发第二个跨度。
我的html
<label for="cpassword" class="form-label">Confirm Password</label>
<input type="password" class="form-control" formControlName="confirmPassword">
<span *ngIf="!confirmPassword.valid && confirmPassword.touched" class="error-block">
<span *ngIf="confirmPassword.hasError('required')">
Please confirm password
</span>
<!-- Check the passwordMatchingValid method, because validators return null if the conditon is true, it will not be detected as an error -->
<span *ngIf="confirmPassword.valid && regForm.hasError('notmatched')">
Password not matched
</span>
</span>
第一个 ngIf 检查确认密码无效。
第二个 ngIf 在同一个 span 中并检查它是否有效。
如果无效,则永远无效。
移动密码不匹配跨度上方的最后一个。
<span *ngIf="!regForm.controls.confirmPassword.valid && regForm.controls.confirmPassword.touched" class="error-block">
<span *ngIf="regForm.controls.confirmPassword.hasError('required')">
Please confirm password
</span>
</span> <-- move the last span here instead -->
<span *ngIf="regForm.controls.confirmPassword.valid && regForm.hasError('notmatched')">
Password not matched
</span>
所以我在 ngOnInit() 中声明了我的 FormGroup 并调用了我的验证器函数以确保密码和 confirmPassword 字段如此匹配
我的打字稿
regForm: FormGroup;
constructor() { }
ngOnInit() {
this.regForm = new FormGroup({
userName: new FormControl('Mark', 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.passwordMatchingValid);
}
// validators return null if the condition is valid and a json object {key: value} if condition is false
passwordMatchingValid(fg: FormGroup) : Validators
{
return fg.get('password').value === fg.get('confirmPassword').value ? null :
{
// {key : value}
notmatched: true
};
}
所有字段也都有自己的 getter 方法,除一件事外一切正常。当密码不匹配时,我的确认密码字段似乎永远不会识别满足的条件,如果该字段中没有任何内容,他们会抱怨,因为它是必需的,但是只要我在输入中添加一个值,错误消息就会消失并且它没有像它应该的那样触发第二个跨度。
我的html
<label for="cpassword" class="form-label">Confirm Password</label>
<input type="password" class="form-control" formControlName="confirmPassword">
<span *ngIf="!confirmPassword.valid && confirmPassword.touched" class="error-block">
<span *ngIf="confirmPassword.hasError('required')">
Please confirm password
</span>
<!-- Check the passwordMatchingValid method, because validators return null if the conditon is true, it will not be detected as an error -->
<span *ngIf="confirmPassword.valid && regForm.hasError('notmatched')">
Password not matched
</span>
</span>
第一个 ngIf 检查确认密码无效。 第二个 ngIf 在同一个 span 中并检查它是否有效。
如果无效,则永远无效。
移动密码不匹配跨度上方的最后一个。
<span *ngIf="!regForm.controls.confirmPassword.valid && regForm.controls.confirmPassword.touched" class="error-block">
<span *ngIf="regForm.controls.confirmPassword.hasError('required')">
Please confirm password
</span>
</span> <-- move the last span here instead -->
<span *ngIf="regForm.controls.confirmPassword.valid && regForm.hasError('notmatched')">
Password not matched
</span>