Escolar Documentos
Profissional Documentos
Cultura Documentos
Conteúdo
Conteúdo
9 Formulários
Formulários
Na grande maioria dos casos em que temos uma aplicação Angular, precisaremos da ajuda de
formulários. O Angular pode nos ajudar a lidar com os formulários HTML a fim de obter os
dados informados pelos usuários, adicionar validação, erros etc. Nesta seção, vamos entender
como as ferramentas do framework podem nos ajudar com essas tarefas.
Antes de começar a mostrar códigos, é importante saber que o Angular possui duas
abordagens para lidar com formulários: Template-Driven e Reactive Forms.
Template-Driven
Esta classe será o nosso modelo de dados, que utilizaremos para o nosso formulário. No
AppComponent , vamos definir um array com os gêneros que aparecerão como opções
https://class.letscode.com.br/apps/academy/courses/977326ae-d78b-4f19-a54b-7f268eecf2dd/122fa596-0ed8-4812-aed8-cd6fc870cb7c/c36c2a… 1/12
07/06/2023, 14:47 Class Let's Code
selecionáveis do form e, em seguida, um objeto da classe User , que será o usuário que vai
aparecer pré-carregado no formulário.
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent implements OnInit {
genders = ['Masculino', 'Feminino'];
ngOnInit() {
console.log(this.user);
}
onSubmit() {
console.log(this.user);
}
}
<div class="form-group">
<label for="gender">Gênero</label>
<select
class="form-control"
id="gender"
name="gender"
required
[(ngModel)]="user.gender"
>
<option *ngFor="let gender of genders" [value]="gender">
{{ gender }}
</option>
</select>
</div>
<button type="submit">Atualizar</button>
</form>
Reactive Forms
https://class.letscode.com.br/apps/academy/courses/977326ae-d78b-4f19-a54b-7f268eecf2dd/122fa596-0ed8-4812-aed8-cd6fc870cb7c/c36c2a… 3/12
07/06/2023, 14:47 Class Let's Code
Obs: Para que essa abordagem reativa funcione e possamos conectar nosso formulário criado
no código TypeScript com o nosso código HTML, precisamos importar o ReactiveFormsModule
no AppModule .
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
signupForm: FormGroup;
}
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
signupForm: FormGroup;
ngOnInit() {
this.signupForm = new FormGroup({
username: new FormControl(null),
email: new FormControl(null),
gender: new FormControl('feminino'),
});
}
}
formGroup (localizada na tag form ), que irá receber o nome do formulário criado no código
TypeScript, e formControlName (localizada na tag input ), que irá receber o nome do controle
criado no código TypeScript.
<form [formGroup]="signupForm">
<div class="form-group">
<label for="username">Username</label>
<input type="text" id="username" formControlName="username" />
</div>
<div class="form-group">
<label for="email">E-mail</label>
<input type="text" id="email" formControlName="email" />
</div>
<div class="form-group">
<label for="gender">Sexo</label>
<input type="text" id="gender" formControlName="gender" />
</div>
</form>
Aninhando FormGroups
Por vezes, precisamos lidar com objetos e dados mais complexos, o que nos traz a necessidade
de implementar o aninhamento de grupos de formulário (FormGroup). Pensando no exemplo
anterior, suponhamos que o objeto criado possua, além do username, do e-mail e do sexo, um
endereço e este, por sua vez, possua rua, número, cidade, estado e CEP. Para adicionar esses
campos, podemos fazer o seguinte:
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
signupForm: FormGroup;
ngOnInit() {
this.signupForm = new FormGroup({
username: new FormControl(null),
email: new FormControl(null),
gender: new FormControl('feminino'),
address: new FormGroup({
street: new FormControl(null),
number: new FormControl(null),
https://class.letscode.com.br/apps/academy/courses/977326ae-d78b-4f19-a54b-7f268eecf2dd/122fa596-0ed8-4812-aed8-cd6fc870cb7c/c36c2a… 5/12
07/06/2023, 14:47 Class Let's Code
E no template:
https://class.letscode.com.br/apps/academy/courses/977326ae-d78b-4f19-a54b-7f268eecf2dd/122fa596-0ed8-4812-aed8-cd6fc870cb7c/c36c2a… 6/12
07/06/2023, 14:47 Class Let's Code
</div>
</form>
Atualizando o formulário
Uma outra forma de preencher o formulário com dados é fazer isto a partir do TypeScript. Para
isso, podemos utilizar os métodos setValue() e patchValue() .
<form [formGroup]="signupForm">
<div class="form-group">
<label for="username">Username</label>
<input type="text" id="username" formControlName="username" />
</div>
<div class="form-group">
<label for="email">E-mail</label>
<input type="text" id="email" formControlName="email" />
</div>
<div class="form-group">
<label for="gender">Sexo</label>
<input type="text" id="gender" formControlName="gender" />
</div>
<div formGroupName="address">
<h3>Endereço</h3>
<div class="form-group">
<label for="street">Rua</label>
<input type="text" id="street" formControlName="street" />
</div>
<div class="form-group">
<label for="number">Número</label>
<input type="text" id="number" formControlName="number" />
</div>
<div class="form-group">
<label for="city">Cidade</label>
<input type="text" id="city" formControlName="city" />
</div>
<div class="form-group">
<label for="state">Estado</label>
<input type="text" id="state" formControlName="state" />
</div>
https://class.letscode.com.br/apps/academy/courses/977326ae-d78b-4f19-a54b-7f268eecf2dd/122fa596-0ed8-4812-aed8-cd6fc870cb7c/c36c2a… 7/12
07/06/2023, 14:47 Class Let's Code
<div class="form-group">
<label for="zipCode">CEP</label>
<input type="text" id="zipCode" formControlName="zipCode" />
</div>
</div>
<button type="button" (click)="updateUser()">Atualizar</button>
</form>
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
signupForm: FormGroup;
ngOnInit() {
this.signupForm = new FormGroup({
username: new FormControl(null),
email: new FormControl(null),
gender: new FormControl('feminino'),
address: new FormGroup({
street: new FormControl(null),
number: new FormControl(null),
city: new FormControl(null),
state: new FormControl(null),
zipCode: new FormControl(null),
}),
});
}
updateUser() {
this.signupForm.patchValue({
username: 'Beltrano',
gender: 'masculino',
address: {
street: 'Rua sem Fim',
number: 854,
},
});
console.log(this.signupForm.value);
}
}
https://class.letscode.com.br/apps/academy/courses/977326ae-d78b-4f19-a54b-7f268eecf2dd/122fa596-0ed8-4812-aed8-cd6fc870cb7c/c36c2a… 8/12
07/06/2023, 14:47 Class Let's Code
Muitos erros podem decorrer do preenchimento indevido dos campos de um formulário. Para
lidar com isso, usamos a validação de formulário.
Para adicionar validação a um formulário Angular, precisamos importar uma função validadora.
O Angular nos disponibiliza a Validators , que nos traz uma série de validações úteis para os
campos do formulário. Vamos ver isso na prática:
Usando o exemplo anterior, vamos definir como obrigatórios os campos de username e e-mail
no formulário.
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
signupForm: FormGroup;
ngOnInit() {
this.signupForm = new FormGroup({
username: new FormControl(null, [Validators.required]),
email: new FormControl(null, [Validators.required]),
gender: new FormControl('feminino'),
address: new FormGroup({
street: new FormControl(null),
https://class.letscode.com.br/apps/academy/courses/977326ae-d78b-4f19-a54b-7f268eecf2dd/122fa596-0ed8-4812-aed8-cd6fc870cb7c/c36c2a… 9/12
07/06/2023, 14:47 Class Let's Code
Note que o status do formulário só passa a ser válido após o preenchimento dos campos
obrigatórios.
Submetendo o formulário
Nas seções anteriores, nós construímos o formulário no nosso código TypeScript e no template,
conectamos ambos, e agora vamos ver como fazemos para submeter esse formulário.
Para fazer isso é simples: iremos reagir ao evento ngSubmit . Quando o evento for acionado,
iremos executar uma função onSubmit . Esse evento será acionado a partir de um botão do tipo
submit .
<label for="username">Username</label>
<input type="text" id="username" formControlName="username" />
</div>
<div class="form-group">
<label for="email">E-mail</label>
<input type="text" id="email" formControlName="email" />
</div>
<div class="form-group">
<label for="gender">Sexo</label>
<input type="text" id="gender" formControlName="gender" />
</div>
<div formGroupName="address">
<h3>Endereço</h3>
<div class="form-group">
<label for="street">Rua</label>
<input type="text" id="street" formControlName="street" />
</div>
<div class="form-group">
<label for="number">Número</label>
<input type="text" id="number" formControlName="number" />
</div>
<div class="form-group">
<label for="city">Cidade</label>
<input type="text" id="city" formControlName="city" />
</div>
<div class="form-group">
<label for="state">Estado</label>
<input type="text" id="state" formControlName="state" />
</div>
<div class="form-group">
<label for="zipCode">CEP</label>
<input type="text" id="zipCode" formControlName="zipCode" />
</div>
</div>
<button type="submit">Submit</button>
</form>
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
signupForm: FormGroup;
https://class.letscode.com.br/apps/academy/courses/977326ae-d78b-4f19-a54b-7f268eecf2dd/122fa596-0ed8-4812-aed8-cd6fc870cb7c/c36c2… 11/12
07/06/2023, 14:47 Class Let's Code
ngOnInit() {
this.signupForm = new FormGroup({
username: new FormControl(null),
email: new FormControl(null),
gender: new FormControl('feminino'),
address: new FormGroup({
street: new FormControl(null),
number: new FormControl(null),
city: new FormControl(null),
state: new FormControl(null),
zipCode: new FormControl(null),
}),
});
}
onSubmit() {
console.log(this.signupForm.value);
}
}
https://class.letscode.com.br/apps/academy/courses/977326ae-d78b-4f19-a54b-7f268eecf2dd/122fa596-0ed8-4812-aed8-cd6fc870cb7c/c36c2… 12/12