Ô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.