Многоэтапные формы — это распространенная техника дизайна UX, которая может повысить удобство использования, упростив процесс для пользователя. Что касается технического аспекта, они могут быть сложными в управлении и организации.

Это можно реализовать с помощью одного большого переключателя в шаблоне, но у этого есть некоторые недостатки:

  • У нас нет ссылки для каждого шага.
  • Это не будет ленивой загрузкой.
  • Это затрудняет управление шаблоном и нарушает принцип единой ответственности.

Наша цель — решить все вышеперечисленное, не вводя дополнительный слой, где мы должны хранить значение формы и достоверность. Давайте посмотрим, как мы можем настроить многошаговую форму в Angular, используя маршрутизатор и инжектор узлов. Хотя в этом примере всего два шага, принципы применимы и к формам с большим количеством шагов.

Мы создадим модуль-контейнер, который будет содержать нашу форму и два дочерних модуля — модули account и payment. Angular CLI делает это проще простого. Просто выполните следующие команды:

Теперь мы можем создать нашу форму в нашем компоненте страницы контейнера:

Теперь, используя инжектор узлов, мы можем получить ссылку на форму. Мы можем внедрить компонент Onboarding напрямую в наших дочерних элементов, но я предпочитаю создавать абстракцию.

Давайте создадим класс FormProvider:

Теперь давайте используем его в нашем компоненте Onboarding:

Наш класс расширяет класс FormProvider и использует DI, чтобы указать Angular вернуть экземпляр этого компонента, когда запрашивается FormProvider. Теперь мы можем использовать его в наших дочерних компонентах, например:

Компоненты могут получить доступ к валидности и значению формы и делать то, что необходимо. Его не нужно поддерживать в хранилище, и мы сделали его маршрутизируемым, ленивым и чистым.

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





Angular (forked) — StackBlitz
Изменить описаниеstackblitz.com



Подпишитесь на меня в Medium или Twitter, чтобы узнать больше об Angular и JS!