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

Entendendo o Typeahead do Ng-Bootstrap

Eu me deparei com o componente typeahead do ng-bootstrap e estou tendo dificuldade para entende-lo. Esse é o código que eu tenho:

Template

<input type="text" formControlName="idFncmt" (selectItem)="setFncmt($event, i)" [inputFormatter]="formatter" [ngbTypeahead]="search" [resultTemplate]="autoTemplate">

<ng-template #autoTemplate let-r="result">
   <option>{{r.nome}}</option>
</ng-template>
Typescript

private listaAuto: Array<any>= [
  {
    id: 2,
    nome: "Trabalho"
  }
];

search = (text$: Observable<string>) =>
    text$
      .debounceTime(200)
      .map(term => term === '' ? []
        : this.listaAuto.filter(v => v.nome.toLowerCase().indexOf(term.toLowerCase()) > -1).slice(0, 10));

  formatter= (value: any) => value.id ? value.nome : value;

Eu tenho as seguntes dúvidas:

1: Como o ng-template está pegando os dados da lista e autocomplete listaAuto sem algum binding direto?

2: Como funciona o search e o formatter? Eu sei que eles pegam e formatam os dados do input mas queria saber como

3: O que é o let-r="result"?

4 respostas
solução!

Boa tarde. Como é uma biblioteca bem específica, você já procurou ajuda na própria documentação?

Eu ainda não usei essa biblioteca, mas os trechos de código soltos que você compartilhou não ajudam muito a tentar entender como ela funciona.

Bom, vou compartilhar o que eu entendi disso tudo ai.

Há uma diretiva chamada ngbTypeahead que é adicionada ao input. Ela espera receber como binding um Observable. Esse observable foi definido no seu componente e se chama search.

Sendo um observable, ele realiza um debounceTime de 200 milissegundos para evitar de capturar qualquer entrada do usuário, isto é, ele só considerará o que o usuário digitou se ele parar poe 200 milissegundos. Faz sentido, para que cada tecla não metralhe seu sistema com operações.

Dai, O observable compara o valor que foi digitado com o valor dentro de sua lista chamada listaAuto. O resultado da comparação é usado para fazer alguma coisa.

O tal do formatter parece um cara que trata o input antes que ele chegue no Observable, poupando o desenvolvedor de ter que fazer isso naquela parte.

Em suma, o data binding é para o observable search acessa a lista listaAuto.

Esse componente tem uma documentação mas é muito vaga:

https://ng-bootstrap.github.io/#/components/typeahead/examples

Se a documentação é vaga, é um forte indício para que você não o use. Aliás, esse é um dos requisitos utilizados por mim ao utilizar determinada biblioteca/plugin, a documentação. Espero que os meus esclarecimentos anteriores tenham lançado uma luz sobre o funcionamento do plugin.

Tudo bem então. Obrigado pela ajuda