所以我有一个类型为输入字段,如下所示:
<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);
我的问题是即使我的输入字段值长度小于3,Observable也会发送请求,即使我已经设置了typeaheadMinLength="3"
。当用户键入值然后快速删除某些字符(比我的去抖时间快)然后尝试输入新值时,就会发生这种情况。当我收到长度小于3的输入值然后我的应用程序中断并且我必须刷新页面以使其再次工作时,我的建议API失败。我试图将去抖时间设置为0,然后我没有遇到这个问题,但这是一个不好的做法,它向我的API发送了太多请求。关于如何解决这个问题的任何想法?
它应该是[typeaheadMinLength]="3" instead of typeaheadMinLength="3"
。当你像typeaheadMinLength="3"
一样分配它时,它就变成了一个字符串赋值。
您可以使用[typeaheadWaitMs]="500"
,它会在用户输入500 MS后调用api调用。这就像去抖动一样。
这是一个解决方案的草图,可以帮助他们修复控件:
在您的observable触发服务调用之前管道过滤器运算符:
this.segments = Observable.create((observer: any) => observer.next(this.segments))
.pipe(filter(number => number.length >= YOUR_MIN_LENTH_LIMIT),
.mergeMap((number: string) => this.suggestionsService.getSegmentSuggestions(this.editForm.get('segment').value));