【发布时间】:2017-02-15 12:43:14
【问题描述】:
我有一个方法,每次更改某些输入文本时都会调用该方法。 (基本上是搜索)。
我想延迟发布/获取请求,因此如果用户快速键入,则只会向服务器发送一个请求。
我在想这样的事情:
public partnerFilterChange(value)
{
if (this.partnersSubscriptions)
this.partnersSubscriptions.unsubscribe();
this.partnersSubscriptions = this.partnersService.list({ filter: value })
.debounceTime(5000)
.subscribe(partners =>
{
delete this.partnersSubscriptions;
this.partners = partners;
});
}
但它不起作用。
Http 请求立即执行,而不是 5 秒后。我也尝试delay 而不是debounceTime。
已编辑:
我使用的是kendo drop down list component and its change event,所以我无法控制函数调用,只能订阅http请求。
【问题讨论】:
-
将
switchMap用于搜索过滤器。 angular.io/docs/ts/latest/guide/… -
你需要重构你的代码,使
debounceTime()操作符位于发出过滤器值的observable和发出HTTP请求的observable之间。类似this.filter.valueChanges.debounceTime(400).mergeMap(filter => this. partnersService.search(term))的东西。见blog.thoughtram.io/angular/2016/01/06/… -
您可以随时将收到的来自 Kendo 的更改推送到您自己的自定义 observable。如果你想去抖动发射的值,它们必须被包裹在一个可观察对象中。
-
@AngularFrance:谢谢 - 只是一个小问题。我不能使用 form.valueChanges 因为值没有改变。 DropDown 上的事件(按下键)在内部处理,并且在您选择项目时更改表单值,而不是在搜索时。
-
form.valueChanges仅适用于原始 Angular 字段。就像我说的,由于您使用的是 Kendo,因此您需要将从 Kendo 收到的值推送到您自己的 observable 中。请参阅下面的答案。
标签: javascript angular rxjs kendo-ui-angular2