Используя FormBuilder, я создаю экземпляр FormArray для массива полей электронной почты. Я назначаю ему набор Validator, который включает собственный Validator и встроенный Validators.email Angular.
this.formBuilder.array(
[this.formBuilder.control('')],
Validators.compose([customValidator, Validators.email])
)
Назначение Validator таким образом означает, что FormArray передается валидаторам как параметр control. Мой собственный валидатор может быть настроен на ожидание FormArray, но Validators.email ожидает FormControl с одним значением.
Как использовать встроенные валидаторы Angular с FormArray?





Метод массива formbuild указывает, что параметры validatorOrOpts or asyncValidator запускаются в самом массиве форм, а не в элементах управления массива, поэтому есть два решения
добавить валидатор в сам элемент управления
this.formBuilder.array(
[this.formBuilder.control('',Validators.email)],
Validators.compose([customValidator])
)
function customArrayEmailValidator(formArray: FormArray) {
if (formArray.length > 0) {
for (let c of formArray.controls) {
let state = Validators.email(c)
if (state !== null) {
return { emailInValid: state }
}
}
return null;
} else {
return null;
}
}
но он по-прежнему выглядит так же, как и в первом способе
Первое решение неудачно, потому что, конечно, его придется применять для каждого отдельного элемента управления, добавляемого в массив. Думаю, второе решение работает настолько хорошо, насколько это возможно, хотя и менее чистое, чем какой-нибудь встроенный в Angular способ.