#angular #angular-reactive-forms #reactive-forms
#angular #angular-реактивные формы
Вопрос:
Я пытаюсь добавить ошибку в элемент управления формой (без каких-либо средств проверки) и ожидать недопустимого состояния элемента управления при отображении. Но он отображается как действительный. Что я получаю неправильно?
Полный пример:https://embed.plnkr.co/aYayRFpBBTEzggL0vkXi /
const name = new FormControl('A Name');
name.setErrors({ 'something': true });
name.markAsTouched();
const street = new FormControl('A Street');
this.formData = new FormGroup({
name,
street
});
Я ожидаю, что не только «улица» недействительна, но и «имя» также должно быть недействительным (потому что в нем есть ошибка «что-то»)…
Спасибо!
Комментарии:
1. Установка ошибки в setTimeout работает, но я думаю, что это не может быть решением:(
2. возможно, вам также нужно
markAsDirty
?
Ответ №1:
Вероятно, ошибки элемента управления реактивной формой сбрасываются после его рендеринга в представлении.
Вполне вероятно, что после добавления полей ввода в представление Angular проверяет наличие проверок, а затем сбрасывает ваши ошибки управления, потому что он не видит их в элементе управления формой (валидаторы не установлены).
Если вы внесете свои изменения в ngAfterViewInit()
, он будет работать нормально. (Но да, тогда вам придется вызывать detect changes после этого, иначе вы будете получать ошибки «ExpressionChangedAfterItHasBeenCheckedError»).
constructor(private _cdr: ChangeDetectorRef) { }
ngOnInit() {
const name = new FormControl('A Name');
const street = new FormControl('A Street');
this.formData = new FormGroup({
name,
street
});
}
ngAfterViewInit() {
this.formData.get('name').setErrors({'something': true})
this._cdr.detectChanges();
}
Смотрите пример здесь:https://plnkr.co/edit/RgEoRPF8jSp203xfwiFS?p=preview
Комментарии:
1. Еще одна ошибка, с которой я столкнулся, заключается в том, что если ваша форма будет удалена из DOM (т. Е. ngIf) после того, как вы использовали
.setErrors()
, эти изменения будут потеряны / сброшены, как только форма вернется.
Ответ №2:
Думаю, я нашел подходящее решение:https://embed.plnkr.co/kop9jGFR6y5C4SnxXgcL /
Вы можете просто установить «поддельный» валидатор вместо установки ошибки:
const name = new FormControl('A Name', {
validators: () => {
return { 'something': true };
}
});
Но я все еще не понимаю, почему он не работает начальным способом:(