角度自定义验证器不反映视图中的更改

时间:2018-05-02 11:35:47

标签: javascript angular ionic-framework angular-forms

我有这样的自定义验证器:

export class PasswordValidator {
    static MatchPassword(AC: AbstractControl) {
        const formGroup = AC.parent;

        if(formGroup) {
            let password = formGroup.value.password // to get value in input tag
            let confirmPassword = formGroup.value.confirmPassword; // to get value in input tag
            if(password != confirmPassword) {
                formGroup.get('confirmPassword').setErrors({ matchPassword: true });
            } else {
                formGroup.get('confirmPassword').setErrors(null);
            }
            console.log(formGroup.get('confirmPassword').errors);
        } else {
            return null
        }
     }
}

我已添加到表单中:

this.registerationForm.addControl("confirmPassword", new FormControl('', Validators.compose([Validators.required, PasswordValidator.MatchPassword])));

在视图中:

  <ion-item class="error-message" *ngIf="registerationForm.controls.confirmPassword.hasError('matchPassword') 
    && registerationForm.controls.confirmPassword.touched">
    <p>Some message*</p>
  </ion-item>

但问题是我可以看到控制台窗口,但我看不到它在视图中反映出来。 ngIf条件未显示错误消息

1 个答案:

答案 0 :(得分:-1)

在角度运行变更检测后更新模型时,或者如果更新根本没有处于角度世界中,则使用detectChanges()。

如果您正在使用OnPush并且通过改变某些数据绕过ChangeDetectionStrategy或者您已经在setTimeout中更新了模型,请使用markForCheck();

export class PasswordValidator {
static MatchPassword(AC: AbstractControl) {
    const formGroup = AC.parent;

    if(formGroup) {
        let password = formGroup.value.password // to get value in input tag
        let confirmPassword = formGroup.value.confirmPassword; // to get value in input tag
        if(password != confirmPassword) {
            formGroup.get('confirmPassword').setErrors({ matchPassword: true });
        } else {
            formGroup.get('confirmPassword').setErrors(null);
        }
        console.log(formGroup.get('confirmPassword').errors);
        this.ref.markForCheck();
    } else {
        return null
    }
 }
}

添加this.ref.markForCheck();更新表单后。