angular4:使用valueChanges observable进行自定义“equals”验证

我需要一个验证来检查email是否等于Email Confirm。为此,我创建了一个自定义验证,如下所示

import { AbstractControl, ValidationErrors, FormGroup } from '@angular/forms';

export function ValidateEqual( equals: string ) {
  return ( control: AbstractControl ): ValidationErrors | null => {

    const equalsField = control.root.get( equals )
    if ( equalsField ) {

      equalsField.valueChanges.subscribe( value => {
        console.log( 'observable fired', value );
        // control.updateValueAndValidity( { onlySelf: true  , emitEvent: false } );
      } );
      if ( control.value !== equalsField.value ) {
        return { equals: true };
      }
    }
    return null;
  }
}

我的表单看起来像

this.loginForm = this.fb.group( {
  password: [ '', [
    Validators.required,
  ] ],
  email: [ '', [
    Validators.required,
    Validators.email,
  ] ],
  emailConfirm: [ '', [
    Validators.required,
    Validators.email,
    ValidateEqual( 'email' ),
  ] ]
} );

因此,我在ValidateEqual()中将检查相等性的字段作为参数传递。这很好用。

以下方案失败:

1)

电子邮件: mattijs@foo.nl

确认电子邮件: mattijs@food.nl

*现在确认电子邮件显示不等于‘email’的错误。正确。

2)

*现在我更改email字段以匹配confirm email字段。

电子邮件: mattijs@food.nl

确认电子邮件: mattijs@food.nl

* confirm email字段上的错误不会消失,因为它不知道有任何更改。

我遇到的问题是,我试图使用equals字段上的valueChanges observable来重新验证control字段,但当我启用control.updateValueAndValidity()时,它在每次按键时都呈指数级订阅,浏览器将崩溃。它通知email confirm字段重新验证,所以它几乎是works...almost。

有没有人知道如何让它只订阅一次,然后让它重新验证control字段,而不需要订阅一次(一次又一次……)?

转载请注明出处:http://www.songfuwangmfj.com/article/20230526/1424505.html