Реактивные формы¶
Реактивные формы (Angular reactive forms) построены на основе механизма, использующего реактивный подход к программированию.
Для их использования нужно импортировать модуль ReactiveFormsModule
.
Создание и валидация Angular reactive forms осуществляется прямо в контроллере. В шаблоне привязывается уже определенная в компоненте модель.
FormGroup и FormControl¶
Реактивная форма Angular — объединение взаимосвязанных полей (группа), которое может содержать дочерние группы.
Группа представляет собой объект FormGroup
, а поле — объект FormControl
. Оба класса импортируются из @angular/forms
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
При определении поля конструктору FormControl
первым параметром передается начальное значение поля. Но если помимо значения необходимо задать другие параметры, например, сделать поле неактивным, используйте объект.
1 |
|
С полным перечнем возможных параметров можно ознакомиться в документации.
В шаблоне главная группа обозначается директивой formGroup
, которой передается переменная одноименного типа, содержащая описание модели формы. Вложенные группы обозначаются директивой formGroupName
, а поля группы — директивой formControlName
.
Если значение директив реактивной формы Angular задается вручную, то директива пишется без квадратных скобок.
1 |
|
А если задается через переменную, то используется запись с квадратными скобками (подобно передаче значения через @Input()
свойство).
1 |
|
1 2 |
|
Основные поля объекта реактивной формы Angular:
controls
— поля, включая вложенныеFormGroup
;errors
— содержит ошибки валидации;status
— строка, определяющая правильность заполнения формы, значение либоVALID
, либоINVALID
;valid
—true
, если форма валидна;invalid
—true
, если форма невалидна;pristine
—true
, если не было взаимодействия с полями;touched
—true
, если одно из полей становилось активным (получало фокус);dirty
—true
, если пользователь заполнил хотя бы одно из полей;value
— значение формы в виде объекта;statusChanges
— позволяет отслеживать изменение статуса валидности;valueChanges
— позволяет отслеживать изменение значения.
Важно
Неактивные (disabled
) поля формы не входят в ее значение и будут отсутствовать в поле value
. Для получения полной модели имеется getRawValue()
.
Реактивные формы позволяют обращаться к отдельному полю используя метод get()
, которому передается в виде строки наименование поля.
1 2 3 |
|
Отслеживание изменений формы осуществляется через подписку на valueChanges
Observable
. Функция обработчик принимает параметром значение формы.
1 2 3 |
|
Использовать valueChanges
можно применительно к отдельному полю.
1 2 3 |
|
Для отслеживания изменения статуса поля или формы в целом "подписывайтесь" на statusChanges
.
1 2 3 |
|
Для сброса значений полей формы или полей одной из ее групп используется метод reset()
, который принимает объект с начальным значением.
1 2 3 4 5 |
|
Для динамического изменения структуры Angular reactive forms предусмотрен ряд методов:
addControl(name: string, value: any)
— добавляет новое поле соответствующей группе;setControl(name: string, value: any)
— заменяет уже существующее поле соответствующей группы;removeControl(name: string)
— удаляет поле из группы.
patchValue() и setValue()¶
Для задания форме значений, например, при редактировании данных, полученных от сервера, используются методы patchValue()
и setValue()
.
Методу setValue()
должен передаваться объект, полностью совпадающий по строению с описанной моделью формы, а patchValue()
— лишь часть этой структуры.
1 2 3 4 5 |
|
Если setValue()
передать "неполную" модель, будет сгенерирована ошибка.
Вторым параметром оба метода принимают объект, с помощью которого, например, можно сделать так, чтобы установка значения Angular reactive forms не инициировала событие valueChanges
.
1 2 3 4 |
|
FormArray¶
Для вывода (или динамического добавления) одной и той же группы или отдельного поля более, чем один раз, необходим экземпляр класса FormArray
.
В представлении для обозначения сущности FormArray
используется formArrayName
. Причем не должно быть совпадений значений formGroupName
или formControlName
в пределах всей формы.
Пример с полем.
1 2 3 4 5 6 7 |
|
1 2 3 4 5 6 |
|
Пример с группой.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
Angular Form Builder¶
В качестве альтернативы можно создать реактивную форму (и настоятельно рекомендуется) с Angular FormBuilder
.
Его использование помогает избежать повторений и повышает читабельность кода.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
Шаблон остается неизменным.
Сперва в зависимостях компонента необходимо указать FormBuilder
, далее создается свойство компонента типа FormGroup
, которому в методе _createForm()
передается создаваемая модель. Метод вызывается в конструкторе компонента.
Модель также может содержать дочерние FormGroup
, созданные с помощью Angular Form Builder.
1 2 3 4 5 6 7 8 |
|