Модуль FormsModule и директива NgModel¶
Для взаимодействия с пользователем в веб-приложениях, как правило применяются формы. В Angular прежде чем использовать формы в компонентах, нам надо импортировать в главном модуле AppModule
модуль FormsModule
, который позволяет работать с формами:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
Кроме того, в файле конфигурации приложения package.json
среди списка используемых зависимостей должен быть указан пакет @angular/forms
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
При работе с формами ключевым моментом является использование директивы NgModel
. Эта директива с помощью переданной модели создает объект FormControl
и привязывает эту модель к созданному элементу формы. Объект FormControl
отслеживает значение модели, а также отвечает за валидацию этого значения и взаимодействие с пользователем.
Данная директива принимает переданную ей модель в качестве входного свойства. Причем мы можем использовать как однонаправленную, так и двунаправленную привязку.
Если нам надо просто вывести значение модели в поле ввода, то можно ограничиться и однонаправленной привязкой:
1 |
|
Это обычная привязка свойства, где в качестве модели используется некоторое свойство title
, определенное в классе компонента.
Если нам надо отслеживать изменение введенных данных, то мы можем использовать двунаправленную привязку:
1 |
|
Рассмотрим применение NgModel
на примере. Возьмем проект с базовой структурой:
Определим в файле app.component.ts
следующий компонент:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
|
Для представления данных здесь определен класс Phone
, в котором есть три свойства. Класс компонента содержит массив объектов Phone
. С помощью метода addPhone()
в этот массив добавляется новый объект.
Для добавления данных в шаблоне определены три поля ввода. В каждом поле определены директивы типа [(ngModel)]="title"
. Тем самым фактически определяются некоторые значения, которые привязаны к этим полям. В обработчике нажатия кнопки вызывается метод addPhone()
, в который передаются эти значения.
В конце шаблона добавленные данные из массива phones
выводятся на страницу:
Все три поля привязаны к отдельным значениям, которые существуют сами по себе. Но мы можем пойти дальше и определить для формы ввода отдельную модель, которая будет инкапсулировать эти значения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
|
Для полей ввода здесь создана отдельная переменная phone
, к свойствам которой привязаны поля ввода. Стоит также обратить внимание на то, как добавляется новый объект в массив phones
— здесь не добавляется напрямую переменная phone
, а создается отдельный объект, который инициализируется значениями из переменной phone
. А в остальном результат будет тем же, что и в предыдущем примере.