Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Primeiro input sempre vazio no FormGroup

O primeior elemento com formControlName declarado no meu HTML não exibe seu valor. Porém ja dei get atraves do FormBuilder e o seu valor vem normalmente. Porém não é exibido no input, nem leva a alteração que for escrita. A partir do segundo elemento funciona normalmente.

<form [formGroup]="clienteForm" (ngSubmit)="salvar()">
<input type="text" formControlName="nomeFantasia" placeholder="Nome Fantasia"><br>
<input type="text" formControlName="cnpj" placeholder="CNPJ"><br>
<input type="text" formControlName="telefone" placeholder="Telefone"><br>
<button type="submit">Salvar</button>
</form>
 this.clienteForm = this.formBuilder.group({
            nomeFantasia: ['nome teste'], //---> "nome teste" nunca é exibido
            cnpj: ['cnpj teste'],
            telefone: ['tel teste']
        });
nomeFantasia: this.clienteForm.get('nomeFantasia').value //---> "nome teste" é retornado normalmente

cliente.module.ts:

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';
import { ReactiveFormsModule } from '@angular/forms';

import { CadastroClienteComponent } from './cadastro/cadastroCliente.component';
import { ListaClienteComponent } from './lista/listaCliente.component';

@NgModule({
  declarations: [
    CadastroClienteComponent,
    ListaClienteComponent
  ],
  imports: [
    CommonModule,
    RouterModule,
    ReactiveFormsModule
  ]
})
export class ClienteModule { }

cadastroCliente.component.ts

import { Component, OnInit } from '@angular/core';
import { FormControl, FormGroup, FormBuilder } from '@angular/forms';

import { ConnectionFactory } from 'src/app/connection/connection.service';
import { ClienteDAO } from 'src/app/dao/clienteDao';
import { ActivatedRoute } from '@angular/router';

@Component({
    templateUrl: 'cadastroCliente.component.html'
})
export class CadastroClienteComponent implements OnInit {

    clienteForm: FormGroup;
    clienteDAO;
    clienteId;

    constructor(
        private formBuilder: FormBuilder,
        private activatedRoute: ActivatedRoute
    ) { }

    ngOnInit() {
        this.clienteId = parseInt(this.activatedRoute.snapshot.params.clienteId);

        ConnectionFactory.getConnection()
            .then(connection => this.clienteDAO = new ClienteDAO(connection))
            .then(this.carregaCliente.bind(this))
            .then(this.carregaForm.bind(this));
    }

    carregaCliente() {
        if (this.clienteId) {
            return this.clienteDAO.select(this.clienteId);
        } else {
            return { nomeFantasia: '', cnpj: '', telefone: '' };
        }
    }

    carregaForm(cliente) {
        this.clienteForm = this.formBuilder.group({
            nomeFantasia: [cliente.nomeFantasia],
            cnpj: [cliente.cnpj],
            telefone: [cliente.telefone]
        });
    }

    salvar() {
        let cliente = {
            id: (this.clienteId ? this.clienteId : this.clienteDAO.AUTO_INCREMENT_KEY),
            nomeFantasia: this.clienteForm.get('nomeFantasia').value,
            cnpj: this.clienteForm.get('cnpj').value,
            telefone: this.clienteForm.get('telefone').value
        };

        this.clienteDAO.save(cliente)
            .then(cliente => {
                if (!this.clienteId) {
                    this.clienteForm.reset();
                }
                alert(`Cliente ${cliente.id} - ${cliente.nomeFantasia} salvo`);
            });
    }
}

cadastroCliente.component.html

Cadastro de Clientes
<br>
<a [routerLink]="['/clientes']">Ver todos</a>
<br>
<br>
<form [formGroup]="clienteForm" (ngSubmit)="salvar()">
    <input type="text" formControlName="nomeFantasia" placeholder="Nome Fantasia"><br>
    <input type="text" formControlName="cnpj" placeholder="CNPJ"><br>
    <input type="text" formControlName="telefone" placeholder="Telefone"><br>
    <button type="submit">Salvar</button>
</form>
5 respostas

Fala aí Gl-lessa, tudo bem? Consegue compartilhar o projeto? Olhando o código que postou não parece ter algo de errado.

Com o código fica melhor para eu ver com calma e detalhe.

Fico no aguardo.

Experimente cadastrar um cliente, depois editar.

Depois experimente descomentar no template html o primeiro elemento com formControl, então o nome fantasia funciona normalmente. Como se esse problema so acontecesse com o primeiro elemento que possui um fromControl.

Outra coisa você pode reparar é que a variavel tituloPagina não é renderizada corretamente no template quando esse formControl esta descomentado (fazendo o nome fantasia funcionar). No cadastro de um novo cliente a varivavel titulo so é renderizada no html apos entrar e sair focus de algum campo.

https://github.com/GuilhermeLessa/teste-pwa

Conseguiu simular?

solução!

O problema é que quando a promise que carrega o formulario é resolvida, o componente ja foi renderizado de forma errada na tela, sem o form builder. Eu achava que o mecanismo de atualização do angular iria ajustar meu formulário depois que a promise fosse resolvida. Mas não. Então a solução foi colocar um ngIf no form com a variavel do form builder.

https://pt.stackoverflow.com/questions/359309/primeiro-input-sempre-vazio-no-formgroup

Fala aí Guilherme, não tive tempo de simular e entender o problema. Fico feliz que tenha encontrado uma solução.

Nessas situações o que é também é comum fazermos é adicionar um loading ou spinner.

Dai enquanto o form não é carregado você deixa ele carregando, após carregar você tira a animação.

Desculpe a demora, o fórum está bombando nessas férias.

Espero ter ajudado e bons estudos.