Итак, у меня есть поле ввода с опережением, которое выглядит так:
<input formControlName="segment"
[typeahead]="segments"
(typeaheadLoading)="segmentsLoading($event)"
(typeaheadNoResults)="segmentsNoResults($event)"
(typeaheadOnSelect)="segmentOnSelect($event)"
typeaheadOptionsLimit="10"
typeaheadMinLength="3"
typeaheadWaitMs="300"
[typeaheadItemTemplate]="customSegmentTemplate"
class="form-control">
И Observable, который помогает мне заблаговременно получать предложения.
this.segments = Observable.create((observer: any) => observer.next(this.segments))
.mergeMap((number: string) => this.suggestionsService.getSegmentSuggestions(this.editForm.get('segment').value);
Моя проблема в том, что Observable отправляет запрос, даже если длина значения моего поля ввода меньше 3, даже если я установил typeaheadMinLength="3"
. Это происходит, когда пользователь вводит значение, а затем быстро удаляет некоторые символы (быстрее, чем время моего устранения неисправности), а затем пытается ввести новое значение. Мой API для предложений не работает, когда он получает входное значение длиной менее 3, а затем мое приложение ломается, и мне нужно обновить страницу, чтобы она снова заработала. Я попытался установить время отладки на 0, и тогда у меня не было этой проблемы, но это плохая практика, и она отправляет слишком много запросов к моему API. Есть идеи, как это решить?
this.segments = Observable.create((observer: any) => observer.next(this.segments)) .mergeMap((number: string) => this.suggestionsService.getSegmentSuggestions(this.editForm.get('segment').value)) .catch((error: any) => { return []; });
Это решило мою проблему на данный момент, но я уверен, что есть лучшее решение, чем это. - person banana   schedule 13.07.2017