Угловой пользовательский валидатор не отражает изменений в представлении - PullRequest
0 голосов
/ 02 мая 2018

У меня есть такой валидатор:

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 голосов
/ 02 мая 2018

Используйте detectChanges (), когда вы обновили модель после того, как angular запустил ее обнаружение изменений, или если обновление вообще не было в угловом мире.

Используйте markForCheck (), если вы используете OnPush и обходите ChangeDetectionStrategy, изменяя некоторые данные, или вы обновили модель внутри setTimeout;

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 (); после обновления формы.

...