Basis Tecnologia da Informação S.A. - 2019
Reactive Forms (Formulários reativos) são formulários que se aproximam do modelo model-driven que facilitam a manutenção de formulários com inputs que atualizam com base nas mudanças.
Reactive Forms é uma das duas maneiras de criar formulários com o Angular.
Reactive Forms utiliza uma abordagem explícita e imutável para gerenciar o estado do componente. A cada mudança no formulário é emitido um novo estado, que manterá a integridade do modelo diante as anterações.
Este tipo de abordagem também provê um caminho direto para testar o modelo, uma vez que seus dados estará consistente e previsível quando requisitado. Todos os consumidores destas requisições poderão realizar atualizações dos dados de forma segura.
Imagine um formulário com muitos campos, validações complexas e lógicas condicionais, e tudo isso, ainda com a complexidade da leitura de código.
Com a utilização do Reactive Forms é possível encapsular toda a camada de validação, lógicas e campos em apenas um lugar, facilitando a manutenção e a leitura do código.
Reactive Forms | Template Driven |
Escalabilidade | Baixa escalabilidade |
Reutilização | Simples de utilizar |
Facilmente testado | Teste mais complexo |
Diferença | Reactive Forms | Template Driven |
Implementação | Mais explícita, criada na classe do componente | Menos explícita, criada por diretivas |
Modelo de dados | Estruturado | Não Estruturado |
Predictabilidade | Síncrono | Assíncrono |
Validação | Baseado em funções | Baseado em diretivas |
Mutabilidade | Imutável | Mutável |
Escalabilidade | Acesso a API de baixo nível | Abstração no topo das APIs |
Validações personalizadas simplificadas
Melhor legibilidade do código
Implementar atualizações de campos com base em eventos
Desabilitar partes do formulário facilmente
Implementar validações assíncronas
Isolar a validação de campos do HTML
No formulário a seguir há necessidade de internacionalização de quase todos os campos da aplicação, também há necessidade de validação e adição dinâmica de campos com base em dados inseridos.
Fazendo com que seja difícil a implementação do mesmo com a utilização do ngModel
![]() |
Inicialize um novo projeto utilizando os comandos abaixo, ou utilize um pré-existente
![]() |
Importe no arquivo src/app/app.module.ts (ou no módulo compartilhado da sua aplicação) o seguinte módulo:
![]() |
A lógica ao implementar um formulário com Reactive Forms é a seguinte:
Temos um componente que ficará responsável pelo formulário, ou seja, toda a regra de negócio deste componente está vinculada apenas à este componente.
Temos componentes responsáveis pela visualização, cadastro e edição, que utilizam o componente anterior de base.
Quando se trata de campos dentro do Reactive Forms existem 3 tipos, sendo eles:
FormGroup
FormControl
FormArray
FormGroup → Agrupador de campos, pode ser comparado à um Objeto
FormControl → Campo, pode ser comparado à um atributo do Objeto
FormArray → Lista de campos, pode ser comparado à um Array
![]() |
![]() |
Existem algumas boas práticas que devem ser seguidas para melhorar a leitura do código e o manter estável.
Outras boas práticas podem ser encontradas na documentação do Angular, aqui citarei apenas as principais e as que são mais utilizadas no dia-a-dia
Inicializar o formulário seguindo os lifecycles do Angular.
![]() |
Desabilitar o formulário pela controller.
![]() |
Para efetuar o debug do formulário, verificar seus valores ou até mesmo verificar erros, pode-se fazer das seguintes formas:
Controller
![]() |
View
![]() |
Outra forma de debugar o formulário é escutando os valores de forma reativa, da seguinte forma:
![]() |
Com a implementação do Reactive Forms, a manutenção do código fica bem mais simples, além de facilitar o entendimento do código para outros desenvolvedores.
Há também uma melhoria na performance, uma vez que a aplicação terá a lógica de validação encapsulada em apenas um componente.
Caso haja alguma dúvida no futuro, sugestão de melhoria na apresentação ou até mesmo apenas para trocarmos uma ideia, entrem em contato pelo Rocket :)
@vinicius.bastos