2
respostas

É realizada a consulta e retorna certo, mas a View não atualiza.

Eu tenho uma view(tela) que é composta de apenas um componente. Esse componente que estou usando como uma pagina tem em seu html apenas um campo de texto com um botao filtar e uma datatable que exibe o resultado do filtro.

Eu chego nessa view utilizando uma rota com parâmetros que filtram a lista inicialmente. Nesse momento tudo está funcionando.

Já estando na tela/componente e filtrando usando o campo texto já não é atualizada a tela.

A função que chamo no ngOnInit() é a mesma que chamo no botão filtrar. O resultado do filtro ocorre normalmente e correto depois de filtrar pelo campo de texto, mas a tela não atualiza.

html simplificado

<form (ngSubmit)="filtrar()">
<label>Competência</label>
<input [(ngModel)]="itemFilter.nome" type="text">
<button type="submit" >Filtar</button>
</form>

<ul>
 <li *ngFor="let item of conjunto"> {{item.nome}}</li>
</ul>

Componente simplificado

private itemFilter: Item =  new Item();
private conjunto: Item [] = new Array<Item>();

ngOnInit() {
    this.filtrar();
}

filtrar() {
   this.itemService.filtraItens(this.itemFilter).subscribe(
       result => this.conjunto= result,
       (error) => console.log(error),
   );
}

Como atualizo essa tela?

2 respostas

Em teoria, é pegar o resultado do seu serviço e jogar a propriedade conjunto, aquela que você itera. Mas você diz que isso não funciona. Há um mistério aqui!

Você também diz que o resultado do filtro result esta correto (tem que ser um array, obrigatoriamente e que cada item do array tenha no mínimo a propriedade nome). Então, há alguma mensagem de erro no console do Chrome?

Quando você carrega a página, você esta filtrando por nenhum parâmetro. O que deveria acontecer quando filtro é nenhum?

Encontrei o problema! Não consegui resolve-lo, mas encontrei.

O result passa por um service antes de ser atribuído em conjunto. Esse service preenche um atributo de item.

E retorno do GET é ima lista de objetos com só um atributo nome. Esse serviço preenche o atributo prefix no item.

Então eu recebo:

[{nome:abacate},  {nome:brumelo}]

E o serviço altera para:

 [
  {nome:abacate, prefix:abac},
  {nome:brumelo, prefix: brum}
 ]

Componente simplificado ATUALIZADO

filtrar() {
   this.itemService.filtraItens(this.itemFilter).subscribe(
       result => 
          this.conjunto= this.prefixManager.loadprefix(result),
       (error) => console.log(error),
   );
}

Service simplificado

public objetosPrefix: any[] = new Array<any>();

 loadprefix(result: any[]): any[] {
    for (let item of result) {
      item.prefix = item.nome.substring(0, 4);
      this.objetosPrefix.push(item);
    }
    return this.objetosPrefix;
  }

Eu fiz um test e quando removi esse service do "meio do caminho" ele atualizou corretamente, mas é claro que o prefix foi comentado para evitar o erro.

Esse serviço faz muitas transformações e preenche muitos atributos em cada objeto.

Alguma ideia de por ande seguir? Realmente já tentei muitas coisas e sem sucesso. Agora eu não sei nem mais o que buscar para realizar novas tentativas.

Já agradeço a toda atenção.