Obtendo e Modificando Modelos - Angular
Além de criar a vinculação de dados, a diretiva ngModel
NgModel
import { CommonModule } from '@angular/common';
import { Component } from '@angular/core';
import { FormsModule, NgModel } from '@angular/forms';
class User {
constructor(
public name: string,
public age: number,
public company: string
) {}
}
@Component({
selector: 'my-app',
standalone: true,
imports: [FormsModule, CommonModule], // para trabalhar com formulários, importamos FormsModule e CommonModule
template: `
<div>
<p>
<label>Nome do usuário</label><br />
<input name="name" [(ngModel)]="user.name" #userName="ngModel" />
</p>
<p>
<label>Idade</label><br />
<input
type="number"
name="age"
[(ngModel)]="user.age"
#userAge="ngModel"
/>
</p>
<p>
<label>Empresa</label><br />
<select
name="company"
[(ngModel)]="user.company"
#userCompany="ngModel"
>
<option *ngFor="let comp of companies">{{ comp }}</option>
</select>
</p>
<button (click)="logUser(userName, userAge, userCompany)">Logar</button>
</div>
<div>
<p>{{ userName.name }}: {{ userName.model }}</p>
<p>{{ userAge.name }}: {{ userAge.model }}</p>
<p>{{ userCompany.name }}: {{ userCompany.model }}</p>
</div>
`,
})
export class AppComponent {
user = new User('', 18, '');
companies: string[] = ['Apple', 'Microsoft', 'Google', 'JetBrains'];
logUser(name: NgModel, age: NgModel, company: NgModel) {
console.log(name);
console.log(age);
console.log(company);
}
}
Aqui, para cada campo de entrada, definimos uma variável do tipo NgModel
#userName="ngModel"
#userAge="ngModel"
NgModel
name
name
model
viewModel
<div>
<p>{{ userName.name }}: {{ userName.model }}</p>
<p>{{ userAge.name }}: {{ userAge.model }}</p>
<p>{{ userCompany.name }}: {{ userCompany.model }}</p>
</div>
Além disso, podemos passar essas variáveis para manipuladores de eventos e tratá-las no código do componente. Por exemplo, o método logUser()
NgModel

Tratando Mudanças de Estado de Modelos
Às vezes, há necessidade de controlar as mudanças na model. No Angular, podemos lidar com eventos embutidos, como o evento change
name
Ao disparar o evento change
onNameChange()
onNameChange() {
if (this.user.name === "admin") {
this.user.name = "Indefinido";
}
}
Suponha que não queiramos permitir que o usuário insira a palavra "admin". Nesse caso, substituímos dinamicamente essa palavra por outra string.
No entanto, há uma limitação: o evento só é acionado quando o campo de entrada perde o foco. Se for necessário processar a entrada dinamicamente à medida que o usuário digita, um método mais adequado seria tratar o evento ngModelChange
ngModelChange
NgModel
O código do método onNameChange()