image

Unlimited bootcamps + English course forever

80
%OFF
Article image
Alexandre Ribeiro
Alexandre Ribeiro20/09/2023 19:18
Share
Microsoft 50 Anos - Prompts InteligentesRecommended for youMicrosoft 50 Anos - Prompts Inteligentes

Criando formulários reativos compartilhados com Angular.

  • #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

Share
Recommended for you
Decola Tech 2025
Desenvolvimento Frontend com Angular
Potência Tech Angular Developer -  Powered by iFood
Comments (2)
Alessandro Lima
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.

Recommended for youMicrosoft 50 Anos - Prompts Inteligentes