Угловые формы: лучшие практики для сложных вложенных реактивных форм и проверки в корневом компоненте

В течение нескольких дней я пытался найти хороший шаблон для моего варианта использования. У меня очень сложная реактивная форма, полная вложенных компонентов, некоторые поля обязательны, некоторые поля могут появляться при определенных условиях и т. Д., И это создает огромную проблему с поддержанием кода. Подход, который я использовал до сих пор, заключается в передаче formControl дочерним компонентам и заполнению оттуда, но стало очень трудно отлаживать, учитывая размер формы. Обязательным условием для этой формы является то, что при отправке всей формы выполняется проверка всех вложенных полей и отмечается отметка AsTouched любого поля, которое требуется, но не было вставлено. Я изучаю 2 подхода, но ни один из них, похоже, не помогает:

  • Аксессор управляющего значения: концепция идеальна, логика идеально разделена между дочерними элементами, и родитель не должен беспокоиться об этом, но КОНЕЦ заключается в том, что дочерние контроллеры не отображаются, и я не могу отметить как соответствующие ошибки
  • Контейнер управления: этот подход, похоже, требует, чтобы все элементы управления были определены на родительском уровне, но, будучи очень большой формой, он кажется действительно контрпродуктивным и не решает мою проблему.

Интересно, есть ли у кого-нибудь опыт работы с такими формами и может ли он дать некоторые рекомендации о том, что является наилучшей практикой в ​​этом случае. Я сделал очень простой stackblitz только с одним дочерним элементом, используя Контейнер управления, к сожалению, мне не удалось запустить его https://stackblitz.com/edit/angular-ivy-axbgr5


person user3353167    schedule 16.06.2020    source источник
comment
Немного прочтения в теме link.medium.com/TUIPSUU6m7 Лучший способ создания реактивного саба -forms with Angular Томаса Траяна   -  person Alex Biro    schedule 16.06.2020
comment
спасибо @AlexBiro я прочитаю   -  person user3353167    schedule 16.06.2020


Ответы (2)


Сложные формы в Angular могут быть большой проблемой. По моему опыту, лучший подход - создать родительский компонент с сохранением состояния и множество дочерних компонентов без состояния.

Родительский компонент должен быть выделен для определенной формы. Дочерние компоненты можно многократно использовать повсюду много раз.

Правила родительского компонента:

  • сохранный
  • создает и удерживает определение формы
  • испускает состояние формы (значение, действительный, нетронутый) при каждом изменении формы
  • содержит настраиваемую логику проверки

Правила для дочерних компонентов:

  • без гражданства
  • получает части формы (вложенные FormGroups) от родителя
  • нет настраиваемой логики проверки

В приведенном выше сценарии дочерние компоненты представляют собой «повторно используемые представления» без какой-либо логики проверки. Это всегда будет исходить от родителей.

Как передать детали формы дочерним компонентам?

Вы можете передать вложенные FormGroups следующими способами:

ControlValueAccessor

На мой взгляд, использование ControlValueAccessor для создания частей формы - не лучшая идея. Логика валидации инкапсулирована внутри. Это хороший подход для создания действительно сложных частей, таких как «палитра цветов», а не просто «адрес клиента» с несколькими полями.

Бизнес-логика вне компонента

Я также попытался вынести бизнес-логику из компонента с помощью следующего простого кода:

constructor(public businessLogic: VendorBusinessLogicService) { }

ngOnInit() {
    this.form = this.businessLogic.createForm(this.initialValue);

    this.subscription = this.form.valueChanges.subscribe(value => {
        this.businessLogic.applyBusinessLogic(value);
        this.emitFormState();
    });

    this.emitFormState();
}

Конечно, необходимо иметь ссылку на форму внутри службы. Если честно, я не вижу в этом пользы. Этот сервис для бизнес-логики выглядит устрашающе. (https://github.com/p-programowanie/angular-forms/tree/forms-separated-business-logic)

person Karol Trybulec    schedule 16.06.2020
comment
Мне очень нравится этот ответ - person WangJi; 04.04.2021

Я обнаружил, что лучше всего создать одну специализированную службу со всей логикой и структурой форм. Все проверки, зависимости, подписки, заполнение групп формы и массива есть. Таким образом, очень легко протестировать детали формы и повторно использовать их.

person IAfanasov    schedule 16.06.2020
comment
Я думал об этом, но тогда у меня все еще была бы действительно действительно массивная форма, с которой нужно было бы иметь дело, а логика очень сложна, я предпочитаю иметь дело с ее соответствующими компонентами. - person user3353167; 16.06.2020
comment
мы пробовали это однажды. нашей команде было трудно поддерживать. Я честно вижу недостатки и преимущества в обоих подходах (: - person IAfanasov; 16.06.2020