Angular-Loiane-Training

Este repositorio contem exemplos documentados e descricoes dos conteudos estudados ao longo do curso de Angular da Loiane

View project on GitHub

Populando campos com setValue e patchValue (autocomplete)

setValue e PatchValue na diretiva ngForm, sao metodos responsaveis por alterar os dados do formulario. No caso do setValue a argumento esperado e um objeto que possui todos os campos do formulario, pois todos os valores serao atualizados e no caso do patchValue o argumento esperado e um objetos que possua apenas os atributos que desejamos alterar no form, os atributos nao contidos no argumento irao permanecer inalterados.

Utilizando SetValue

import { map } from 'rxjs/operators';
import { HttpClient } from '@angular/common/http';
import { Component, OnInit } from '@angular/core';
import { NgForm } from '@angular/forms';
@Component({
  selector: 'app-template-driven-form',
  templateUrl: './template-driven-form.component.html',
  styleUrls: ['./template-driven-form.component.css']
})
export class TemplateDrivenFormComponent implements OnInit {

  // ...atributos

 // ...demais metodos

  public consultaCep(cep: string, form: NgForm) {
    const SOMENTE_DIGITOS_REGEX: RegExp = /\D/g
    const VALIDA_CEP_REGEX: RegExp = /^[0-9]{8}$/
    cep = cep.replace(SOMENTE_DIGITOS_REGEX, "")
    if(cep !== "" && VALIDA_CEP_REGEX.test(cep)) {
      this.http.get(`https://viacep.com.br/ws/${cep}/json/`).pipe(map(dados => dados))
        .subscribe(dados => {
          console.log(dados)
          this.populaDadosForm(dados, form)
        })
    }
  }

  private populaDadosForm(dados: any, form: NgForm) {
    form.setValue({
      nome: null,
      email: null,
      endereco: {
        cep: dados.cep,
        numero: null,
        rua: dados.logradouro,
        complemento: dados.complemento,
        bairro: dados.bairro,
        cidade: dados.localidade,
        estado: dados.uf
      }
    })
  }

}

Note que ao utilizar o setValue se os campos nome, email e numero ja estiverem preechidos seus valores serao perdidos.


utilizando setValue

Utilizando patchValue

o metodo patchValue e uma metodo da classe FormGroup, note que o formulario possui um atributo com a key form, este e um objeto do tipo FormGroup e atraves dele o metodo patchValue pode ser chamado, seu comportamento e similar ao metodo setValue, porem a argumento pode receber um objeto que possui apenas os campos que deseja-se que sejam alterados.

import { map } from 'rxjs/operators';
import { HttpClient } from '@angular/common/http';
import { Component, OnInit } from '@angular/core';
import { NgForm } from '@angular/forms';
@Component({
  selector: 'app-template-driven-form',
  templateUrl: './template-driven-form.component.html',
  styleUrls: ['./template-driven-form.component.css']
})
export class TemplateDrivenFormComponent implements OnInit {

  // ... demais atributos

  // ...demais metodos

  public consultaCep(cep: string, form: NgForm) {
    const SOMENTE_DIGITOS_REGEX: RegExp = /\D/g
    const VALIDA_CEP_REGEX: RegExp = /^[0-9]{8}$/
    cep = cep.replace(SOMENTE_DIGITOS_REGEX, "")
    if(cep !== "" && VALIDA_CEP_REGEX.test(cep)) {
      this.http.get(`https://viacep.com.br/ws/${cep}/json/`).pipe(map(dados => dados))
        .subscribe(dados => {
          console.log(dados)
          this.populaDadosForm(dados, form)
        })
    }
  }

  private populaDadosForm(dados: any, formulario: NgForm) {
    formulario.form.patchValue({
      endereco: {
        cep: dados.cep,
        rua: dados.logradouro,
        complemento: dados.complemento,
        bairro: dados.bairro,
        cidade: dados.localidade,
        estado: dados.uf
      }
    })
  }

}


utilizando patchValue