Template driven формы можно использовать в тех случаях, когда нужно сделать небольшую форму или если приложение переходит с AngularJS на Angular (ngModel
работает так же как ng-model
в AngularJS). Во всех остальных случаях лучше использовать реактивные формы.
Преимущества реактивных форм:
- Лучше масштабируются
- Разделение бизнес и презентационной логики
- Повышается читабельность кода
- Проще поддерживать
- Проще применять кастомную валидацию
Нужно использовать ngSubmit
чтобы слушать событие отправки формы. При сабмите формы будет вызываться соответствующий метод.
<form [formGroup]="checkoutForm" (ngSubmit)="onSubmit()"></form>
Директива NgForm
создает новую сущность FormGroup
и байндит ее к элементу <form>
шаблона, собирает все значения полей формы и следит за их изменениями и валидацией. При импорте Forms Module
директива применяется по умолчанию ко всем тегам <form>
. Применяется на уровне шаблона.
FormGroup
собирает значения каждой дочерней FormControl
в один объект, где ключами будут имена контроллеров полей формы.
FormControl
следит за значением и валидацией одного конкретного контроллера формы.
FormBuilder
упрощает создание новых сущностей FormControl
, FormGroup
или FormArray
. Сокращает количество кода, необходимого для создания сложных форм.
Для валидации формы, созданной с помощью FormBuilder
нужно:
- Импортировать валидаторы:
import { Validators } from "@angular/forms";
- Добавить массив с валидаторами к контроллеру поля формы:
this.contactForm = this.formBuilder.group({
name: ["", [Validators.required, Validators.minLength(10)]],
email: ["", [Validators.required, Validators.email]],
country: ["", [Validators.required]],
});
dirty
имеет значение true
, если пользователь поменял значение поля формы.
touched
имеет значение true
, если пользователь сделал активным (blur) поле ввода, но не менял значение поля формы.
pristine
имеет значение true
, если пользователь вообще не трогал это поле формы.
У каждого поля формы в Angular есть свойство errors
. К примеру, если мы задали валидацию Validators.required
, то мы можем показать наш текст ошибки с помощью *ngIf
:
<div *ngIf="name.errors?.required">Обязательное поле</div>
Источники:
- https://blog.angular-university.io/introduction-to-angular-2-forms-template-driven-vs-model-driven/
- https://angular.io/start/start-forms
- https://angular.io/api/forms/FormControl
- https://angular.io/api/forms/FormBuilder
- https://www.tektutorialshub.com/angular/angular-formbuilder-in-reactive-forms/#validations
- https://angular.io/guide/form-validation