Estado do Modelo e Validação - Angular
Estado do Modelo
A aplicação da diretiva ngModel
Se o elemento de entrada ainda não recebeu foco, a classe
é aplicada. Se o campo de entrada já tiver recebido foco, a classeng-untouched
é aplicada. O recebimento de foco não precisa ser acompanhado por uma alteração no valor desse campo.ng-touched
Se o valor original do campo de entrada foi alterado, a classe
é aplicada. Se o valor não foi alterado desde o carregamento da página, a classeng-dirty
é aplicada ao elemento de entrada.ng-pristine
Se o valor no campo de entrada for válido, a classe
será aplicada. Se o valor for inválido, a classeng-valid
será aplicada.ng-invalid
Por exemplo, ao carregar uma página web com o seguinte elemento de entrada:
<input class="form-control" name="username" [(ngModel)]="username" />
Será gerada a seguinte marcação HTML:
<input class="form-control ng-untouched ng-pristine ng-valid" name="username" ng-reflect-name="username" />
Validação
Antes de enviar o formulário, é necessário garantir que ele contenha valores corretos. Para essa verificação, é utilizado o mecanismo de validação. No Angular, é possível usar a validação HTML5, aplicada por meio de atributos:
: exige a inserção de um valor.required
: define uma expressão regular que os dados inseridos devem seguir.pattern
Para usar a validação, definimos o seguinte componente:
import { Component } from "@angular/core";
import { FormsModule } from "@angular/forms";
class User {
constructor(
public name: string,
public email: string,
public phone: string
) {}
}
@Component({
selector: "my-app",
standalone: true,
imports: [FormsModule],
styles: `
.alert { color: red; }
div { margin: 5px 0; }
`,
template: `<div>
<div>
<label>Nome</label><br>
<input name="name" [(ngModel)]="user.name" #name="ngModel" required />
<div [hidden]="name.valid || name.untouched" class="alert">
Nome não informado
</div>
</div>
<div>
<label>Email</label><br>
<input name="email" [(ngModel)]="user.email" #email="ngModel"
required pattern="^[a-zA-Z0-9.!#$%&’*+/=?^_{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$" />
<div [hidden]="email.valid || email.untouched" class="alert">
Email inválido
</div>
</div>
<div>
<label>Telefone</label><br>
<input name="phone" [(ngModel)]="user.phone" #phone="ngModel"
required pattern="[0-9]{11}" />
<div [hidden]="phone.valid || phone.untouched" class="alert">
Telefone inválido
</div>
</div>
<button (click)="addUser()">Adicionar</button>
</div>`
})
export class AppComponent {
user: User = new User("", "", "");
addUser() {
console.log(this.user);
}
}
Neste exemplo, definimos uma classe User
User
required
pattern
<div [hidden]="email.valid || email.untouched" class="alert">
Email inválido
</div>
Aqui, estamos verificando a validade do campo de email. Para isso, utilizamos a variável email
NgModel
(#email="ngModel")
valid
untouched
true
hidden
true
div
Apesar dos erros de validação, ainda podemos clicar no botão e executar o método addUser()
<button [disabled]="name.invalid || email.invalid || phone.invalid"
(click)="addUser()">Adicionar</button>
Com a expressão [disabled]="name.invalid || email.invalid || phone.invalid"
disabled
true

Estiliando Campos Inválidos
Além de exibir mensagens de erro, é possível estilizar campos inválidos. Para isso, podemos usar a classe ng-invalid
import { Component } from "@angular/core";
import { FormsModule } from "@angular/forms";
class User {
constructor(
public name: string,
public email: string,
public phone: string
) {}
}
@Component({
selector: "my-app",
standalone: true,
imports: [FormsModule],
styles: `
.alert { color: red; }
div { margin: 5px 0; }
input.ng-touched.ng-invalid { border: solid red 2px; }
input.ng-touched.ng-valid { border: solid green 2px; }
`,
template: `<div>
<div>
<label>Nome</label><br>
<input name="name" [(ngModel)]="user.name" #name="ngModel" required />
</div>
<div>
<label>Email</label><br>
<input name="email" type="email" [(ngModel)]="user.email" #email="ngModel"
required email />
</div>
<div>
<label>Telefone</label><br>
<input name="phone" [(ngModel)]="user.phone" #phone="ngModel"
required pattern="[0-9]{11}" />
</div>
<button [disabled]="name.invalid || email.invalid || phone.invalid"
(click)="addUser()">Adicionar</button>
</div>`
})
export class AppComponent {
user: User = new User("", "", "");
addUser() {
console.log(this.user);
}
}
Neste exemplo, adicionamos estilos para campos inválidos e válidos. Para isso, usamos as classes ng-touched
ng-invalid
ng-valid
