Если у вас большая форма, я бы создал вложенную группу форм для тех элементов управления, которые зависят друг от друга, а затем прикрепил бы пользовательский валидатор к этой вложенной форме. Например:
this.form = this.fb.group({
nested: this.fb.group(
{
haveConcerns: [false],
concerns: [""]
},
{ validators: concernValidator }
)
});
, который затем запускается всякий раз, когда изменяется любое из значений formcontrol.
ДЕМО ЗДЕСЬ
Конечно, вы также можете прикрепить валидатор к основной форме, но если у вас очень большая форма, онабудет срабатывать без необходимости при редактировании не относящихся к делу полей.
Если вы сделаете это, вам нужно будет создать собственное сопоставление состояний ошибок, так как mat-error
не отображается, если в группе форм есть ошибка, только когда в контроле форм есть ошибка. Как сделать настраиваемое сопоставление состояний ошибок для этой цели, можно найти здесь .
Если вы действительно хотите, чтобы валидатор был на concerns
контроль формы, как вы заметили, вы должны каким-то образом запускать проверку на этом контроле формы при каждом изменении haveConcerns
. Этого можно добиться, прослушивая valueChanges
(или просто функцию, которая прослушивает изменение) для этого элемента управления формы и вызывая this.form.get('concerns).updateValueAndValidity()
, что вызовет пользовательский валидатор для этого поля, например:
this.form.get("haveConcerns").valueChanges.subscribe(data => {
this.form.get('concerns').updateValueAndValidity();
});
Если вы это сделаете, не забудьте отписаться от компонента OnDestroy