Article image
Alexandre Ribeiro
Alexandre Ribeiro20/09/2023 19:18
Compartilhe

Criando formulários reativos compartilhados com Angular.

    Muitas vezes encontramos cenários onde temos que criar vários formulários em Angular para vários propósitos.

    Mas muitas vezes os nossos formulários se repetem ao longo da nossa aplicação onde geramos por diversas vezes códigos replicados onde na verdade poderiamos ter um código onde esses formulários podessem ser reaproveitados. Então para esse cenário podemos ter reaproveitamento de formulários onde os campos são repetidos então para ter mais clareza eu trouxe um exemplo simples para fixar mais o contéudo.

    Para isso criei um componente de Formulário e o chamei de FormularioPai

    onde temos um formulário reativo.

    import { Component, OnInit } from '@angular/core';
    import { FormBuilder, FormGroup, Validators } from '@angular/forms';
    
    @Component({
    selector: 'app-formulario-pai',
    templateUrl: './formulario-pai.component.html',
    styleUrls: ['./formulario-pai.component.css'],
    })
    export class FormularioPaiComponent implements OnInit {
    
    form: FormGroup;
    
    constructor(private fb: FormBuilder ) {}
    
    ngOnInit() {
      this.createForm();
    }
    
    private createForm() {
      this.form = this.fb.group({
        city: ['', Validators.required],
        cep: ['', Validators.required],
        uf: ['', Validators.required],
        name: ['', Validators.required],
        gender: ['', Validators.required],
        role: ['', Validators.required],
        occupation: ['', Validators.required],
        salary: ['', Validators.required],
      });
    }
    
    
    save() {
      console.log(this.form.getRawValue());
    }
    
    }
    

    image

    Se notarmos os campos Nome, Sexo, Cidade, Estado e CEP vai se repetir para quando formos cadastrar algum posição referente a pessoas. Então nesse caso vale a pena separar em um componente FormularioPessoa que chamei para um melhor entendimento como FormularioFilho, onde esse componente exporta seu formulário e suas caracteristicas de validação usando a função getForm().

    import { Component } from '@angular/core';
    import { FormBuilder, FormGroup, Validators } from '@angular/forms';
    
    @Component({
    selector: 'app-formulario-filho',
    templateUrl: './formulario-filho.component.html',
    styleUrls: ['./formulario-filho.component.css'],
    })
    export class FormularioFilhoComponent {
    private form: FormGroup;
    
    constructor(private fb: FormBuilder) {}
    
    getForm() {
      this.form = this.fb.group({
        city: ['', Validators.required],
        cep: ['', Validators.required],
        uf: ['', Validators.required],
        name: ['', Validators.required],
        gender: ['', Validators.required],
      });
      return this.form;
    }
    }
    

    E no componente de FormularioPai foi adicionado o formulário filho usando @ViewChild acessamos as propriedades e metódos do formulário filho e o resultado ficou dessa forma.

    import { Component, OnInit, ViewChild } from '@angular/core';
    import { FormBuilder, FormGroup, Validators } from '@angular/forms';
    import { FormularioFilhoComponent } from '../formulario-filho/formulario-filho.component';
    
    @Component({
    selector: 'app-formulario-pai',
    templateUrl: './formulario-pai.component.html',
    styleUrls: ['./formulario-pai.component.css'],
    })
    export class FormularioPaiComponent implements OnInit {
    @ViewChild(FormularioFilhoComponent, { static: true })
    formularioFilho: FormularioFilhoComponent;
    
    form: FormGroup;
    
    constructor(private fb: FormBuilder) {}
    
    ngOnInit() {
      this.createForm();
    }
    
    private createForm() {
      this.form = this.fb.group({
        person: this.formularioFilho.getForm(), 
        role: ['', Validators.required],
        occupation: ['', Validators.required],
        salary: ['', Validators.required],
      });
    }
    
    save() {
      console.log(this.form.getRawValue());
    }
    }
    

    Notem que agora temos uma propriedade person no nosso formulario onde é herdadado as caracteristicas do formulário filho.

    Dessa forma podemos aproveitar código e evitar replicação desnecessária de blocos de código na nossa aplicação.

    O link da aplicação se encontra nesse link: https://stackblitz.com/edit/angular-gehcdq

    Compartilhe
    Comentários (2)

    AL

    Alessandro Lima - 22/09/2023 16:29

    A escolha entre essas duas abordagens depende do tipo de formulário que você está construindo e das necessidades do seu projeto. Formulários reativos oferecem maior flexibilidade e controle, enquanto formulários baseados em template podem ser mais rápidos de implementar em cenários simples.

    Guilherme Oliveira
    Guilherme Oliveira - 20/09/2023 19:22

    Interessante gostei dessa abordagem.