Оператор distinctUntilChanged
выдает только тогда, когда текущее значение отличается от последнего, как вы уже знаете.
Однако, пожалуйста, обратите внимание на слово value .
Вы используете distinctUntilChanged
, но на чем именно работает этот оператор?
fromEvent
прослушивает событие keyup и, как и ожидалось, будет излучать объект KeyboardEvent
.
Это можно доказать, добавив оператор tap
в текущую реализацию:
fromEvent(this.inputBox.nativeElement, 'keyup')
.pipe(
// wait 300 ms to start
debounceTime(300),
tap(e => console.log(e)),
// if value is the same, ignore
distinctUntilChanged(),
// start connection
switchMap(term => this.autocompleteService.search({term: myterm}))
).subscribe((result: any[]) => {
console.log(result);
});
Так что distinctUntilChanged
не будет выполнять глубокое сравнение объектов.
Вместо этого, извлеките значение с помощью оператора map
, после чего оно должно работать как положено:
fromEvent(this.inputBox.nativeElement, 'keyup')
.pipe(
debounceTime(300),
map(val => val.target.value),
distinctUntilChanged(),
switchMap(val => this.search(val))
).subscribe((result) => {
console.log(result);
});