1
resposta

Como utilizar debounceTime ( chamando serviço uodate) para executar após finalização da alteração

Bom dia, preciso criar um meio de chamar serviço update no backend somente após o usuário finalizar a digitação, tentei com o debounce, mas não consigo fazer , abaixo o html e o componente ts, agradeço a ajuda desde já.

carrinho-list.component.html

 <td>
      <input [(ngModel)]="carrinho.quantidade" type="text" style='color: red; width: 60px;  font-size: 10px;'
        (ngModelChange)="atualizarCarrinho(carrinho)" class="nav-link">
    </td>

carrinho-list.component.ts

atualizarCarrinho(carrinho: Carrinho) { this.carrinhoService.update(carrinho).subscribe(() => { this.carrinhoService.showMessage('Carrinho Atualizado'); }); }

1 resposta

Ôpa, beleza Givanildo! Não sei se é o caso para este curso que está participando, mas vai aqui como eu faria para chamar o backend somente após o usuário finalizar a digitação utilizando debounceTime, sendo que o debounceTime precisaremos estipular um tempo para que após ser digitado a segunda alteração será disparado a chamada quando o tempo for finalizado, então vamos lá.

Primeira coisa, no template irei substituir o ngModelChange por keyup, passando o valor no evento ocorrido:

  • (keyup)="atualizarCarrinho($event.target.value)"

Segundo no component criaria duas variáveis:

carrinhoChange = new Subject<string>();
subscription: Subscription;
  • carrinhoChange será um Subject do tipo string, para que possamos controlar as entradas e a chamada no back com RxJS.
  • subscription por que precisaremos guardar a referência da inscrição qeu faremos e no final do processo desescrever.

Terceiro no método atualizarCarrinho ficaria desta forma:

atualizarCarrinho(event): void {
    this.carrinhoChange.next(event.target.value);
    this.subscription = this.carrinhoChange
      .pipe(debounceTime(500))
      .subscribe((carrinho: string) => {
        this.carrinhoService.update(carrinho).subscribe(() => {
          this.carrinhoService.showMessage('Carrinho Atualizado');
        });
        this.subscription.unsubscribe();
      });
  }

Primeiro pegamos o valor vindo do input e passamos através do next para atualizar o carrinhoChange; Em seguida dentro do pipe utilizamos o debounceTime com o tempo de 500 milesegundos, quando o usuário deixar de digitar será respeitado o tempo definido e então o subscribe será disparado, o carrinhoService será chamado passando o ultimo valor do carrinhoChange, no final é só dar um unsubscribe para desescrever.

Espero ter ajudado e esclarecido.