Typeahead - довольно распространенная проблема, и rxjs - замечательный инструмент для решения этой проблемы.Давайте предположим, что input$
является наблюдаемой, испускающей строку поиска, введенную пользователем, вы можете сделать это следующим образом:
input$.pipe(
// This is optional, just a suggestion. It prevents a
// request from being started while the user is still
// quickly typing a word. The value is a time in ms, see
// the operators docs for details.
debounceTime(250),
// Here's the actual piece of code: switchMap will
// start a new inner subscription whenever a new search
// input comes along, cancelling any still on-going previous
// request. This avoids any race conditions.
switchMap(input => input.length > this.minCityNameLength
? this.detailsITService.fetchCitiesByName(input)
: of([])
)
).subscribe(…);
Способ, которым вы устанавливаете поток input$
, будет, например, с
<input type="text" (input)="input$.next($event.target.value)" />
, где input$
определяется как
public input$ = new Subject<string>();
Рабочий пример можно найти здесь .Вы также можете увидеть эффект debounceTime
, если открыть консоль и попробовать ее с оператором и без оператора.