Что у меня сейчас есть: У меня есть пользовательская реализация автозаполнения, выглядит так в html:
<input [formControl]="parentFormControl"
(mouseup)="autocomplete()"
(input)="autocomplete()">
<ul *ngIf="showAutocompleteList">
<li *ngFor="let listItem of autocompleteList; let index = index;">
<a role="option" href="#" type="button" (mousedown)="select(listItem)" [innerHtml]="highlight(listItem)"></a>
</li>
</ul>
parentFormControl - это значение за входом (так сказать, модальное)и является FormControl.Таким образом, это инкапсулирует текст, который отображается на входе и передается с помощью кнопки отправки.
Теперь каждый раз, когда я набираю или нажимаю на вводе, вызывается функция автозаполнения и выполняется обычный асинхронный вызов с подпиской:
autocomplete(): void {
if (this.autocompleteSubscription) {
this.autocompleteSubscription.unsubscribe();
}
this.autocompleteSubscription = this.http.get('url').subscribe(
(autocompleteList: Array<OptionItem>) => {
this.autocompleteList = autocompleteList;
}
);
}
На самом деле у меня нет задержки для вызова aysnc, поэтому каждый раз, когда пользователь печатает, я немедленно вызываю бэкэнд.Но представьте, что пользователь типа «Программное обеспечение», я, конечно, не хочу отображать какие-либо несущественные результаты.Например, мы набрали «Soft», и вызов XHR сработал.Мы продолжаем печатать и печатать «Softw», еще один вызов XHR выполняется до того, как первый вызов завершит свою работу.Так что я фактически немедленно отменил первое выполнение, так как оно больше не актуально.Вот почему каждый раз, когда вызывается функция автозаполнения, я вызываю отписку от предыдущей подписки.
Вопрос: Это способ, которым я должен реализовать свое поведение автозаполнения?Сегодня я видел художественную вещь об одной и той же вещи, но они реализуют это поведение с подробным (или чистым?) Rxjs, с Pipes.это ссылка: https://blog.strongbrew.io/building-a-safe-autocomplete-operator-with-rxjs/
Я также видел другие примеры, представляющие собой каналы, но они также содержат в своем html немного сторонний синтаксис, такой как '{{text $ |async}} '.
Итак, я хотел убедиться, является ли то, что у меня есть сейчас (подписаться и отписаться), хорошим способом достижения того, чего я хочу?Или я должен действительно изменить реализацию и реализовать что-то вроде того, что у них есть?Какая сторона имеет какие плюсы и минусы?
И если я должен переключить свою реализацию, можете ли вы предоставить пример кода с моим formControl в качестве модели?
Заранее спасибо
Редактировать:
У меня теперь есть что-то вроде этого:
ngOnInit(): void {
this.parentFormControl.valueChanges
.pipe(
debounceTime(1000),
distinctUntilChanged(),
filter(value => this.myGetRequestCondition() ? true : false),
switchMap((value: string) => {
return this.http.get('url' + value)
.pipe(catchError(err => {
this.myErrorFunction(err);
return EMPTY;
}));
}))
.subscribe(autocompleteList => {
this.autocompleteList = autocompleteList;
});
}