Erro angular 8 *ngForm

fiz um método para consulta de cep e não consigo aplicar os dados no form, obtenho o erro

ERROR Error: Must supply a value for form control with name: ‘nome’.
no entanto eu tenho o campo com name=nome em meu formulário

consultaCEP(cep, form) {

    cep = cep.replace(/\D/g, '');

    if (cep != "") {

      var validacep = /^[0-9]{8}$/;

      if (validacep.test(cep)) {

        this.http.get(`//viacep.com.br/ws/${cep}/json`).subscribe(dados => {

          this.populaDadosForm(dados, form)

        })

      }

    }

  }

  populaDadosForm(dados, form) {

    debugger

    form.setValue({

      nome: form.value.nome,

      email: form.value.email,

      cpf: form.value.cpf,

      dataNascimento: form.value.dataNascimento,

      contato1: form.value.contato1,

      contato2: form.value.contato2,

      cep: dados.cep,

      logradouro: dados.logradouro,

      numero: '',

      complemento: dados.complemento,

      bairro: dados.bairro,

      cidade: dados.localidade,

      estado: dados.uf

    });

  }
<form #clienteForm="ngForm" (ngSubmit)="salvar()">

          <div class="form-group row">

            <div class="col-md-12">

              <div class="alert alert-success alert-dismissible fade show" role="alert" *ngIf="msgSuccess">

                Cliente salvo/atualizado com sucesso!

                <button type="button" class="close" data-dismiss="alert" aria-label="Close">

                  <span aria-hidden="true">&times;</span>

                </button>

              </div>

              <div class="alert alert-danger alert-dismissible fade show" role="alert" *ngFor let erro of errors>

                {{error}}

                <button type="button" class="close" data-dismiss="alert" aria-label="Close">

                  <span aria-hidden="true">&times;</span>

                </button>

              </div>

            </div>

          </div>

          <div class="form-group row">

            <div class="col-md-12">

              <label>Nome</label>

              <input type="text" class="form-control" id="nome" [(ngModel)]="cliente.nome" name="nome">

            </div>

            <div class="col-md-5">

              <label>CPF</label>

              <input type="text" class="form-control" id="cpf" [(ngModel)]="cliente.cpf" name="cpf">

            </div>

            <div class="col-md-7">

              <label>Email</label>

              <input type="text" class="form-control" id="email" [(ngModel)]="cliente.email" name="email">

            </div>

            <div class="col-md-3">

              <label>Data de Nascimento</label>

              <input type="text" class="form-control" id="dataNascimento" [(ngModel)]="cliente.dataNascimento"

                name="dataNascimento">

            </div>

            <div class="col-md-4" *ngIf="cliente.id">

              <label>Data de Cadastro</label>

              <input disabled=true type="text" class="form-control" id="dataCadastro" [(ngModel)]="cliente.dataCadastro"

                name="dataCadastro">

            </div>

            <div class="col-md-3" *ngIf="cliente.id">

              <label>Situação</label>

              <select class="custom-select" id="inlineFormCustomSelectPref" id="situacao" [(ngModel)]="cliente.situacao"

                name="situacao">

                <option selected>Situação.</option>

                <option value="A">ATIVO</option>

                <option value="I">INATIVO</option>

              </select>

            </div>

            <div class="col-md-4">

              <label>Contato 1</label>

              <input type="text" class="form-control" id="contato1" [(ngModel)]="cliente.contato1" name="contato1">

            </div>

            <div class="col-md-4">

              <label>Contato 2</label>

              <input type="text" class="form-control" id="contato2" [(ngModel)]="cliente.contato2" name="contato2">

            </div>

          </div>

          <hr />

          <div class="form-group row">

            <div class="col-md-12 mb-2">

              <label>ENDEREÇO</label>

            </div>

            <div class="col-md-4" [ngClass]=aplicaCssErro(cep)>

              <label>CEP</label>

              <input (blur)="consultaCEP($event.target.value, clienteForm)" type="text" class="form-control" id="cep"

                [(ngModel)]="cliente.endereco.cep" name="cep" required #cep="ngModel">

              <div *ngIf="!cep.valid && cep.touched" class="alert alert-danger alert-dismissible fade show"

                role="alert">

                O Campo CEP é obrigatório

                <button type="button" class="close" data-dismiss="alert" aria-label="Close">

                  <span aria-hidden="true">&times;</span>

                </button>

              </div>

            </div>

            <div class="col-md-2">

              <label>Numero</label>

              <input type="text" class="form-control" id="numero" [(ngModel)]="cliente.endereco.numero" name="numero">

            </div>

            <div class="col-md-6">

              <label>Complemento</label>

              <input type="text" class="form-control" id="complemento" [(ngModel)]="cliente.endereco.complemento"

                name="complemento">

            </div>

            <div class="col-md-10">

              <label>Logradouro</label>

              <input disabled type="text" class="form-control" id="logradouro" [(ngModel)]="cliente.endereco.logradouro"

                name="logradouro">

            </div>

            <div class="col-md-7">

              <label>Bairro</label>

              <input disabled type="text" class="form-control" id="bairro" [(ngModel)]="cliente.endereco.bairro"

                name="bairro">

            </div>

            <div class="col-md-4">

              <label>Cidade</label>

              <input disabled type="text" class="form-control" id="cidade" [(ngModel)]="cliente.endereco.cidade.nome"

                name="cidade">

            </div>

            <div class="col-md-4">

              <label>Estado</label>

              <input disabled type="text" class="form-control" id="estado" [(ngModel)]="cliente.endereco.cidade.nome"

                name="estado">

            </div>

          </div>

        </form>

No angular, vc tem 2 abordagens para forms:

Aqui vc declara os detalhes do form no componente e referencia os campos na tela pela diretiva formControl em cada campo. No componente, vc instancia os formControls e já coloca os detalhes do campo, como validação, por exemplo.

Aqui os campos do form são tratado pela diretiva ngModel, onde vc faz o bind para a propriedade declarada no componente.


Cada abordagem tem sua aplicabilidade. Pelo seu código, parece que é um form reativo. Se for, vc deve colocar no campo um [(formControl)]="nome".

Recomendo que dê uma olhada nos links de cada tipo de form, pois lá há um exemplo de cada tipo.

Obrigado pela explicação lucas, vou tentar e te digo

lucas, aqui no meu caso estou tentando trabalhar apena com o template, como devo fazer nesse caso?

Basicamente é vc declarar uma propriedade no componente:

componente {
   obj: Any = {};
}

E no html:

[(ng-model)]="obj.propA"
[(ng-model)]="obj.propB"

Ao fazer isso, o obj do componente será preenchido com os valores de acordo com os inputs do html.

1 curtida