У меня есть следующие RxJ для автозаполнения:
this.persons = this.searchField.valueChanges.pipe(
filter(q => q.length >= 3),
debounceTime(500),
distinctUntilChanged(),
switchMap(q => {
this.isSearching = true;
return this.service.findPerson(q).pipe(catchError(e => this.onSearchError(e)));
}),
map(res => {
this.isSearching = false;
return res.body;
})
);
Это прекрасно работает, за исключением одного: Observable не сбрасывается, когда поле поиска очищается. Есть ли хороший способ, как я могу этого добиться?
@DhananjaiPai Observable должен выдавать пустое значение, чтобы список результатов не отображался





Вы можете просто изменить порядок операторов и вместо filter вернуть EMPTY внутри switchMap (или в конечном итоге, например, of(null), в зависимости от того, как вы хотите очистить автозаполнение.
import { EMPTY } from 'rxjs';
...
this.searchField.valueChanges.pipe(
debounceTime(500),
distinctUntilChanged(),
switchMap(q => {
if (q.length >= 3) {
this.isSearching = true;
return this.service.findPerson(q).pipe(catchError(e => this.onSearchError(e)));
} else {
this.isSearching = false;
return EMPTY; // or `of(...)` with some value so you know that the autocomplete should be cleared.
}
}),
map(res => {
this.isSearching = false;
return res.body;
});
это может вызвать ошибку в res.body, так как res теперь будет пустой/строкой, и вы сопоставляете его, чтобы получить значение как объект?
map не будет генерировать исключение, потому что EMPTY не выдает никаких значений. Вот почему я оставил там комментарий, потому что он зависит от логики OP. 3 жестко закодирован, потому что я сомневаюсь, что вы захотите изменить его на лету как значение из другого Observable.
Спасибо, это сработало. Но мне пришлось использовать of({ body: [] }) вместо EMPTY.
что вы имеете в виду под сбросом?