Справочная информация
У меня есть ОЧЕНЬ большая форма (потенциально сотни полей), которую я решил разбить на более мелкие компоненты субформы (по очевидным причинам). Я достиг этого, используя Access Value Accessors. Это работало как чудо, пока не пришло время показывать ошибки в полях при отправке.
Подформы сформированы так:
<form [formGroup]="form">
<app-subform [documentId]="documentId" formControlName="sub-form"></app-subform>
<!-- Other form fields here ... -->
</form>
Чтобы упростить свою работу, я создал компонент ошибок который принимает в качестве входных данных элемент управления, как в коде ниже. Код ниже является частью формы.
<div class="question">
<label for="tableNumber">
Figure/table number
<app-required [type]="'conditional'"></app-required>
</label>
<input type="text" id="tableNumber" formControlName="figure"/>
<app-error [control]="form.get('figure')"></app-error>
</div>
Внутренняя часть моей ошибки HTML выглядит примерно так:
<span class="errorWrapper" *ngIf="control.invalid && control.touched" (click)="clearError()" [innerHtml]="error"></span>
Пример кода
Хотя я не могу поделиться своим полным кодом, вот воспроизводство проблемы: https://stackblitz.com/edit/encapsulated-sub-forms
Проблема
Когда я отправляю свой код, чтобы получая сообщения об ошибках, отображаемые на каждом входе, я отмечаю все входы как прикосновенные, используя this.form.markAllAsTouched();
Хотя это работает как прелесть для входных данных, которые не являются частью компонентов субформы, сами компоненты субформы вообще не реагируют, оставаясь нетронутыми.
Решения, которые я рассмотрел
- Моя первая реакция была - почему бы не пометить каждый элемент управления как индивидуальный? Не работает
- Как насчет того, чтобы реализовать ввод для каждого компонента формы, при котором триггеры помечаются как затронутые? Не пытался, больше похоже на взлом, чем на лучшее решение
- Измените мою реализацию на использование
ControlContainer
. Кажется наиболее перспективным
То, что я пробовал
Я пытался изменить реализацию для использования ControlContainer
, но это сопряжено с собственным набором проблем (описано в отдельный вопрос о переполнении стека).
Мой вопрос
Итак, в общем, я хочу знать, как я могу получить свои данные в форме для отображения ошибок при отправке, следуя рекомендациям и с минимальным количеством переписать (мои приоритеты в этом порядке)?