4

所以我有一个预先输入的输入字段,如下所示:

<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"。当用户输入一个值然后快速删除一些字符(比我的去抖动时间快)然后尝试输入一个新值时,就会发生这种情况。我的建议 API 在收到长度小于 3 的输入值时失败,然后我的应用程序中断,我必须刷新页面以使其再次工作。我尝试将去抖时间设置为 0,然后我没有遇到这个问题,但这是一种不好的做法,它向我的 API 发送了太多请求。关于如何解决这个问题的任何想法?

4

2 回答 2

1

这是一个解决方法的草图,在他们修复控件之前可能会有所帮助:

在您的 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));
于 2019-03-01T17:57:43.690 回答
0

应该是[typeaheadMinLength]="3" instead of typeaheadMinLength="3"。当你给它赋值时typeaheadMinLength="3",它变成了一个字符串赋值。

您可以使用 [ typeaheadWaitMs]="500",它将在用户输入 500 毫秒后调用 api 调用。这就像去抖动。

于 2017-12-23T13:21:57.363 回答