Angular предоставляет два подхода для работы с формами: реактивные формы и шаблонные формы. В этом разделе рассматриваются шаблонные формы, которые являются более декларативным способом работы с данными формы, где основное внимание уделяется разметке HTML. Шаблонные формы идеально подходят для простых и средних форм, а также для тех случаев, когда не требуется сложной логики взаимодействия с формой.
Шаблонные формы используют двустороннюю привязку данных (two-way data binding) для синхронизации значений модели и представления. Это означает, что любые изменения, сделанные пользователем в форме, автоматически обновляют модель данных, а любые изменения в модели данных мгновенно отображаются в форме.
Чтобы создать шаблонную форму в Angular, нужно:
ngModel для привязки формы к
модели данных.<form>.ngModelШаблонная форма в Angular начинается с привязки поля формы к
переменной модели с помощью директивы ngModel. Например,
простая форма с полем для ввода имени может выглядеть так:
<form #myForm="ngForm">
<label for="name">Имя:</label>
<input id="name" name="name" ngModel>
<button [disabled]="!myForm.valid">Отправить</button>
</form>
Здесь:
ngModel связывает поле ввода с моделью
данных.#myForm="ngForm" создает ссылку на форму и
связывает её с объектом NgForm, который Angular использует
для управления состоянием формы.myForm.valid определяет, будет ли кнопка
отправки доступна, исходя из валидности всей формы.Angular предоставляет несколько встроенных директив для валидации
данных в шаблонных формах. Чтобы указать требования к полям формы, можно
использовать такие директивы, как required,
minlength, maxlength,
pattern.
Пример с валидацией обязательного поля:
<form #myForm="ngForm">
<label for="name">Имя:</label>
<input id="name" name="name" ngModel required>
<div *ngIf="myForm.submitted && !name.valid" class="error">
Имя обязательно для заполнения.
</div>
<button [disabled]="!myForm.valid">Отправить</button>
</form>
В этом примере:
required указывает, что поле
обязательное.Объект NgForm позволяет отслеживать состояние всей
формы. С помощью свойств, таких как valid,
invalid, dirty, pristine, можно
определить, является ли форма валидной, была ли она изменена или
очищена.
Пример использования:
<form #myForm="ngForm" (ngSubmit)="onSubmit(myForm)">
<label for="name">Имя:</label>
<input id="name" name="name" ngModel required>
<button [disabled]="!myForm.valid">Отправить</button>
</form>
Здесь событие ngSubmit срабатывает, когда форма
отправляется, и передает ссылку на объект формы. Объект
myForm предоставляет данные о состоянии формы, которые
могут быть использованы для дополнительных проверок.
После того как пользователь заполнил форму, данные можно обработать в
методе компонента. В шаблонной форме данные связываются с моделью через
директиву ngModel. Чтобы получить доступ к этим данным,
можно использовать ссылку на форму или привязать данные непосредственно
в событии отправки формы.
Пример обработки данных в компоненте:
@Component({
selector: 'app-user-form',
templateUrl: './user-form.component.html'
})
export class UserFormComponent {
onSubmit(form: NgForm) {
console.log('Форма отправлена', form.value);
}
}
Здесь метод onSubmit получает данные формы через
свойство value, которое представляет собой объект с полями,
соответствующими имени каждого элемента в форме.
Шаблонные формы в Angular удобны для работы с фиксированными наборами данных. Однако, если форма становится динамической (например, если элементы формы генерируются на основе данных, полученных с сервера), то лучше использовать реактивные формы, так как они дают больше гибкости.
Тем не менее, можно комбинировать оба подхода: динамически создавать элементы формы с помощью директив Angular в шаблоне и управлять ими через компоненты.
Пример динамической формы:
<form #myForm="ngForm" (ngSubmit)="onSubmit(myForm)">
<label *ngFor="let field of fields" [for]="field.name">{{ field.label }}</label>
<input *ngFor="let field of fields" [id]="field.name" [name]="field.name" [(ngModel)]="field.value" [required]="field.required">
<button [disabled]="!myForm.valid">Отправить</button>
</form>
В этом примере массив fields содержит объект с описанием
каждого поля, и форма генерируется динамически.
Преимущества:
Недостатки:
Шаблонные формы являются мощным инструментом в Angular для работы с простыми и средними формами. Благодаря использованию директив и двусторонней привязке данных, они позволяют легко связывать элементы формы с данными модели, обеспечивая удобный и эффективный способ работы с пользовательским вводом. Несмотря на то что шаблонные формы не так гибки, как реактивные, они идеально подходят для многих сценариев, требующих минимальных усилий для настройки и реализации.