Atualizado: 03/01/2025

Diretiva ngForm - Angular

Geralmente, ao trabalhar com formulários, todos os elementos de entrada não são definidos isoladamente, mas são colocados dentro de um elemento de formulário padrão: <form></form>. Utilizar esse elemento permite gerenciar todos os campos de entrada como um formulário único.

No Angular, a diretiva especial NgForm foi criada para manipulação de formulários. Ela gera um objeto FormGroup e o associa ao formulário, permitindo rastrear o estado do formulário e gerenciar sua validação.

Podemos aplicar essa diretiva definindo uma variável na tag do formulário:

<form #myForm="ngForm">

Embora ao usar formulários não seja obrigatório utilizar essas variáveis que representam o formulário como um todo, ao utilizá-las, podemos obter algumas funcionalidades adicionais. Em particular, podemos acessar o status do formulário através dessa variável.

Por exemplo, veja o seguinte componente AppComponent:

import { Component } from "@angular/core";
import { FormsModule, NgForm } from "@angular/forms";

class User {
    constructor(
        public name: string,
        public email: string,
        public phone: string
    ) {}
}

@Component({
    selector: "my-app",
    standalone: true,
    imports: [FormsModule],
    styles: `
        input.ng-touched.ng-invalid {border: solid red 2px;}
        input.ng-touched.ng-valid {border: solid green 2px;}
    `,
    template: `<form #myForm="ngForm" novalidate>
                    <p>
                        <label>Nome</label><br>
                        <input name="name" [(ngModel)]="name" required />
                    </p>
                    <p>
                        <label>Email</label><br>
                        <input name="email" ngModel required email />
                    </p>
                    <p>
                        <label>Telefone</label><br>
                        <input name="phone" ngModel required pattern="[0-9]{10}" />
                    </p>
                    <button [disabled]="myForm.invalid" (click)="submit(myForm)">Adicionar</button>
                </form>
                <p>Nome: {{myForm.value.name}}</p>
                <p>Email: {{myForm.value.email}}</p>`
})
export class AppComponent {
    name: string = "";
    email: string = "";
    phone: string = "";

    submit(form: NgForm) {
        console.log(form);
    }
}

Para utilizar a diretiva NgForm, é necessário importá-la do pacote "angular/forms":

import { NgForm } from "@angular/forms";

No formulário, foi definida a variável #myForm, que é inicializada com o valor "ngForm". Isso significa que a variável myForm representa a diretiva NgForm, e através dessa variável podemos acessar todo o formulário.

Mesmo que não tenhamos explicitamente adicionado a diretiva NgForm, o Angular automaticamente a aplica à tag do formulário. Essa diretiva adiciona várias funcionalidades ao elemento form. Em particular, ela encapsula todos os elementos do formulário que utilizam a diretiva ngModel, permitindo acessar o estado desses elementos, além de validar os dados inseridos. Para rastrear o estado, o Angular adiciona algumas classes à tag do formulário:

<form class="ng-pristine ng-untouched ng-valid" novalidate="">

As classes ng-pristine, ng-untouched, e ng-valid são as mesmas que se aplicam aos elementos de controle e que foram discutidas no tema anterior.

A seguir, podemos utilizar o formulário, principalmente para sua validação. Primeiramente, o formulário utiliza o atributo "novalidate", que desativa a exibição das mensagens de erro de validação padrão do navegador. Isso ocorre porque, nesse caso, confiamos no mecanismo de validação do Angular. E, na prática, uma forma que é válida para o Angular nem sempre será considerada válida pelo navegador.

Em segundo lugar, utilizando o estado do formulário, podemos desabilitar o botão, evitando certas ações quando ele for pressionado:

<button [disabled]="myForm.invalid">

No método submit(), que é chamado ao clicar no botão, também podemos acessar o formulário inteiro e seus valores:

onSubmit(myForm: NgForm) {
  console.log(myForm);
}

Os elementos do formulário utilizam a diretiva ngModel. Apenas em um caso usamos uma expressão de vinculação. A vinculação com ngModel não é obrigatória, embora seja comumente usada na forma de vinculação bidirecional. A diretiva ngModel simplesmente indica que o campo de entrada ao qual é aplicada será incluído no objeto myForm.

Ao trabalhar com a variável myForm, é importante lembrar que ela representa um objeto que encapsula todas as informações do formulário.

Enviando dados usando form e diretiva ngForm em Angular

Por exemplo, através da propriedade controls, podemos acessar os elementos do formulário aos quais foi aplicada a diretiva ngModel. Os nomes desses elementos correspondem aos valores do atributo name dos campos de entrada.

Para obter os valores inseridos, também podemos utilizar a propriedade value:

<p>Nome: {{myForm.value.name}}</p>
<p>Email: {{myForm.value.email}}</p>

É importante destacar que o acesso ao elemento correspondente só será possível se a diretiva ngModel for aplicada ao campo, como visto nos exemplos acima.

Envio de Formulário

Após preencher o formulário, o usuário geralmente o envia clicando em um botão de envio (<input type="submit" />), que costuma ser colocado na parte inferior do formulário. No Angular, para gerenciar o envio do formulário, podemos utilizar o evento ngSubmit, que é disparado ao clicar no botão de envio:

import { Component } from "@angular/core";
import { FormsModule, NgForm } from "@angular/forms";

class User {
    constructor(
        public name: string,
        public email: string,
        public phone: string
    ) {}
}

@Component({
    selector: "my-app",
    standalone: true,
    imports: [FormsModule],
    styles: `
        input.ng-touched.ng-invalid {border: solid red 2px;}
        input.ng-touched.ng-valid {border: solid green 2px;}
    `,
    template: `<form #myForm="ngForm" novalidate (ngSubmit)="onSubmit(myForm)">
                    <p>
                        <label>Nome</label><br>
                        <input name="name" ngModel required />
                    </p>
                    <p>
                        <label>Email</label><br>
                        <input name="email" ngModel required email />
                    </p>
                    <p>
                        <label>Telefone</label><br>
                        <input name="phone" ngModel required pattern="[0-9]{10}" />
                    </p>
                    <input type="submit" [disabled]="myForm.invalid" value="Enviar" />
                </form>`
})
export class AppComponent {
    name: string = "";
    email: string = "";
    phone: string = "";

    onSubmit(form: NgForm) {
        console.log(form);
    }
}

Nesse caso, ao gerar o evento ngSubmit, o método onSubmit() definido no componente será acionado. Utilizando esse método, podemos processar os dados enviados diretamente ou realizar algum tipo de pré-processamento antes de enviá-los para o servidor.

Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com