我需要一个验证来检查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