Angular Реактивная форма: Удалить Specifi c Validator из управления - PullRequest
0 голосов
/ 21 февраля 2020

Я работаю с Angular реактивными формами. В моем сценарии валидаторы динамически добавляются в мои элементы управления.

Это делается следующим образом:

const myControl = myFormGroup.get('myControl');

if (myControl.validator) {
    myControl.setValidators([ myControl.validator, Validators.required ]); //preserve existing validators
} else {
    myControl.setValidators([ Validators.required ]);
}

Это работает просто отлично.

Проблема

Мне также нужен способ удалить указанный c валидатор при сохранении остальных.

myControl.validators возвращает только функцию, но не массив валидаторы, которые делают невозможным выбрать один для удаления, оставляя другие.

Я знаю, что есть обходные пути, такие как отслеживание существующих валидаторов elswhere, et c. Мой вопрос, однако, заключается в следующем: может ли это быть достигнуто непосредственно на AbstractControl?

Следующая проблема на Github обсуждает проблему: https://github.com/angular/angular/issues/13461

Решения, предоставленные там кажется, не работает для меня, так как мне приходится иметь дело не только с требуемым валидатором, но и с многочисленными пользовательскими валидаторами.

Заранее благодарен за любые подсказки или решения для этого!

Ура, Майк

1 Ответ

0 голосов
/ 13 марта 2020

Поскольку для этого нет элегантного решения, я укусила пулю, чтобы написать свой собственный валидатор RequiredIf.

Он выполняет две функции:

  • кэширует оригинальные валидаторы контролирует это применяется к. Если свойство больше не требуется, оно восстановит исходные валидаторы (при удалении требуемого валидатора).
  • оно добавляет слушателей valueChange к свойству, от которого зависит валидация. Если свойство становится обязательным или больше не требуется, оно будет проверять элемент управления, чтобы немедленно показать новые результаты проверки.

Вот мой код средства проверки (так же, как я использую его в настоящее время, нет времени оптимизировать его) .

Ура, Майк

...