offline version v3
Запись на курсы по HTML, CSS, JavaScript, PHP, фреймворкам и CMS,
а также: помощь в поиске работы и заказов, стажировка на реальных проектах→
menu

Начало работы с формами в Angular

Для работы с формами отправки данных в Angular вначале нужно импортировать специальный модуль FormsModule:

import { Component} from '@angular/core'; import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { FormsModule } from '@angular/forms'; @NgModule({ imports: [BrowserModule, FormsModule], declarations: [AppComponent], bootstrap: [AppComponent] }) export class AppModule { }

Также стоит проверить, есть ли поле 'angular/forms' в файле package.json:

{ "name": "test", "version": "0.0.0", "scripts": { "ng": "ng", "start": "ng serve", "build": "ng build", "watch": "ng build --watch --configuration development", "test": "ng test" }, "private": true, "dependencies": { ... "@angular/forms": "^16.2.0", ... } }

Далее мы будем работать с формами с помощью директивы NgModel. Директива создает на основе объекта FormControl модель взаимодействия с нужным элементом формы. Также она принимает параметром переданную ей модель. При этом можно использовать однонаправленную и и двунаправленную привязки.

Если мы хотим просто вывести значение модели в поле ввода, то можно использовать однонаправленную привязку:

<input name="title" [ngModel]="title" />

Такая привязка свойства в качестве модели использует свойство title, заданное в классе главного компонента.

В случае, когда мы хотим отследить изменение введенных данных, то нам следует применить двунаправленную привязку:

<input name="title" [(ngModel)]="title" />

Давайте рассмотрим взаимодействие с формами на следующем примере. Пусть у нас будет форма для добавления продукта в список. Для каждого продукта нужно ввести через форму название, цену и выбрать его вид из выпадающего списка.

Для начала в главном компоненте нашего проекта сделаем и экспортируем класс Product:

import { Component, ViewChild, ElementRef } from '@angular/core'; export class Product { constructor(public title: string, public price: number, public prodType: string) { } }

Теперь в классе AppComponent пропишем свойства каждого продукта - title, price, prodType. Также зададим свойство products, определяющее массив продуктов, и свойство prodTypes - для массива типов продуктов. Также реализуем функцию, добавляющую новый продукт в соответствующий массив:

@Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent { title: string = ''; price: number = 0; prodType: string = ''; products: Product[] = []; prodTypes: string[] = ['fruits', 'vegetables', 'dairy']; addProduct(){ this.products.push(new Product(this.title, this.price, this.prodType)); } }

Переходим в HTML-шаблон и прописываем нашу форму. В инпуты с именами title и price мы будем просто вводить любые значения. В выпадающем списке prodType мы выберем одно из значений массива prodTypes с помощью цикла ngFor. При нажатии на кнопку мы отправим все введенные и выбранные данные в массив главного компонента. А внизу также с помощью цикла ngFor выведем каждый добавленный продукт как пункт маркированного списка:

<div> <div class="form-group"> <label>Title</label> <input class="form-control" name="title" [(ngModel)]="title" /> </div> <div class="form-group"> <label>Cost</label> <input type="number" class="form-control" name="price" [(ngModel)]="price" /> </div> <div class="form-group"> <label>Product Type</label> <select class="form-control" name="prodType" [(ngModel)]="prodType"> <option *ngFor="let prodType of prodTypes" [value]="prodType"> {{prodType}} </option> </select> </div> <div class="form-group"> <button (click)="addProduct()">Add Product</button> </div> </div> <div><h3>Added products</h3> <ul> <li *ngFor="let prod of products">{{prod.title}} ({{prod.prodType}}) - {{prod.price}}</li> </ul> </div>

Повторите в своем проекте пример, приведенный в уроке.