Я не думал, что вы могли бы использовать функцию-член компонента (метод) для своего пользовательского валидатора.Я предположил, что это должна быть внешняя функция от вашего класса.
Моя выглядит так:
function emailMatcher(c: AbstractControl): { [key: string]: boolean } | null {
const emailControl = c.get('email');
const confirmControl = c.get('confirmEmail');
if (emailControl.pristine || confirmControl.pristine) {
return null;
}
if (emailControl.value === confirmControl.value) {
return null;
}
return { 'match': true };
}
И я присоединяю валидатор к дочерней группе formGroup так:
this.customerForm = this.fb.group({
firstName: ['', [Validators.required, Validators.minLength(3)]],
lastName: ['', [Validators.required, Validators.maxLength(50)]],
emailGroup: this.fb.group({
email: ['', [Validators.required, Validators.email]],
confirmEmail: ['', Validators.required],
}, { validator: emailMatcher }),
phone: ''
});
Вы можете поместить свой валидатор в отдельный файл или в тот же файл либо выше, либо ниже класса вашего компонента.Примерно так:
function passwordMatchValidator(frm: FormGroup) {
return frm.controls['password'].value ===
frm.controls['confirmpassword'].value ? null : {'mismatch': true};
}
Тогда вы бы определили валидатор без ключевого слова this
:
{validator: passwordMatchValidator},
Полный пример вы можете найти здесь: https://github.com/DeborahK/Angular-ReactiveForms/tree/master/Demo-Final