Я реализую кросс-полевую проверку для двух полей в форме (реактивный подход / подход на основе модели) и не знаю, как мне добавить ошибку в существующий список ошибок элемента управления формой.
Форма:
this.myForm = new FormGroup({
name: new FormControl('', Validators.minLength(3));
city: new FormGroup({
cityOne: new FormControl('', Validators.minLength(3)),
cityTwo: new FormControl('', Validators.minLength(3))
}, this.validateEqualCities)
});
Валидатор:
validateEqualCities(formGroup: FormGroup) {
return (control: AbstractControl): { [key: string]: any } => {
if (formGroup.controls['cityOne'].value && formGroup.controls['cityTwo'].value && formGroup.controls['cityOne'].value !== formGroup.controls['cityTwo'].value) {
formGroup.controls['cityOne'].setErrors({ 'equalCities': true }, { emitEvent: true });
formGroup.controls['cityTwo'].setErrors({ 'equalCities': true }, { emitEvent: true });
return { 'equalCities': false };
} else {
formGroup.controls['cityOne'].updateValueAndValidity({ onlySelf: true, emitEvent: false });
formGroup.controls['cityTwo'].updateValueAndValidity({ onlySelf: true, emitEvent: false });
}
return null;
};
}
Моя проблема: если проверка не удалась, setErrors (..) отменяет все ошибки, которые уже есть (валидаторы formControls), поэтому нет правильного состояния, потому что на самом деле должно быть 2 ошибки.
Если я не устанавливаю ошибки для формирования элементов управления напрямую, а только возвращаю ошибку в форму, только форма является недействительной и получает ошибку, но не ее элементы управления.
Как я могу добиться того, чтобы и форма, и элементы управления имели реальное состояние проверки?
Большое тебе спасибо!