Modulo FormsModule e Diretiva ngModel - Angular
Nas aplicações web, geralmente utilizamos formulários para interagir com o usuário. Para implementar a funcionalidade dos formulários, os componentes precisam importar o módulo FormsModule
imports
FormsModule
AppModule
import { Component } from "@angular/core";
import { FormsModule } from "@angular/forms";
@Component({
selector: "my-app",
standalone: true,
imports: [FormsModule], // Importa FormsModule para trabalhar com formulários
template: ``
})
export class AppComponent { }
Além disso, no arquivo de configuração da aplicação (package.json
"angular/forms"
{
"name": "helloapp",
"version": "1.0.0",
"description": "Projeto Angular",
"author": "www.programicio.com",
"scripts": {
// comandos angular cli
},
"dependencies": {
"@angular/forms": "~17.0.0",
// outros pacotes
},
"devDependencies": {
// outros pacotes
}
}
Ao trabalhar com formulários, a diretiva essencial é o NgModel
FormControl
FormControl
A diretiva NgModel
Se for necessário apenas exibir o valor do modelo no campo de entrada, o binding unidirecional é suficiente:
<input name="title" [ngModel]="title" />
Aqui, um vínculo simples de propriedade é utilizado, onde o modelo é uma propriedade title
Caso seja necessário acompanhar as alterações nos dados inseridos, utilizamos o binding bidirecional:
<input name="title" [(ngModel)]="title" />
Agora, vamos examinar a aplicação do NgModel
helloapp/ ├── src/ │ ├── app/ │ │ ├── app.component.ts │ ├── main.ts │ ├── index.html ├── angular.json ├── package-lock.json ├── package.json └── tsconfig.json
Aqui está a definição do componente em app.component.ts
import { Component } from "@angular/core";
import { FormsModule } from "@angular/forms";
class User {
constructor(public name: string,
public age: number,
public company: string) { }
}
@Component({
selector: "my-app",
standalone: true,
imports: [FormsModule], // Importa FormsModule para trabalhar com formulários
template: `<div>
<p>
<label>Nome do usuário</label><br>
<input name="name" [(ngModel)]="name" />
</p>
<p>
<label>Idade</label><br>
<input type="number" name="age" [(ngModel)]="age" />
</p>
<p>
<label>Empresa</label><br>
<select name="company" [(ngModel)]="company">
@for(comp of companies; track $index){
<option [value]="comp">
{{comp}}
</option>
}
</select>
</p>
<button (click)="addUser()">Adicionar</button>
</div>
<div>
<h3>Itens adicionados</h3>
<ul>
@for(u of users; track $index){
<li>{{u.name}} ({{u.company}}) - {{u.age}}</li>
}
</ul>
</div>`
})
export class AppComponent {
name: string = "";
age: number = 18;
company: string = "";
users: User[] = [];
companies: string[] = ["Apple", "Microsoft", "Google", "Jetbrains"];
addUser() {
this.users.push(new User(this.name, this.age, this.company));
}
}
Aqui, foi definida a classe User
AppComponent
[(ngModel)]
addUser()
users
No final do template, os dados adicionados são exibidos na página:

Os três campos de entrada estão vinculados a valores separados que existem independentemente. No entanto, é possível ir além e definir um modelo que encapsule esses valores, como mostrado abaixo:
import { Component } from "@angular/core";
import { FormsModule } from "@angular/forms";
class User {
constructor(public name: string,
public age: number,
public company: string) { }
}
@Component({
selector: "my-app",
standalone: true,
imports: [FormsModule], // Importa FormsModule para trabalhar com formulários
template: `<div>
<p>
<label>Nome do usuário</label><br>
<input name="name" [(ngModel)]="newUser.name" />
</p>
<p>
<label>Idade</label><br>
<input type="number" name="age" [(ngModel)]="newUser.age" />
</p>
<p>
<label>Empresa</label><br>
<select name="company" [(ngModel)]="newUser.company">
@for(comp of companies; track $index){
<option [value]="comp">
{{comp}}
</option>
}
</select>
</p>
<button (click)="addUser()">Adicionar</button>
</div>
<div>
<h3>Itens adicionados</h3>
<ul>
@for(u of users; track $index){
<li>{{u.name}} ({{u.company}}) - {{u.age}}</li>
}
</ul>
</div>`
})
export class AppComponent {
newUser = new User("", 18, "Google");
users: User[] = [];
companies: string[] = ["Apple", "Microsoft", "Google", "Jetbrains"];
addUser(){
this.users.push({...this.newUser});
}
}
Aqui, foi criada a variável newUser
users
newUser
newUser