可以在创建后更换淘汰节流阀扩展器吗?

时间:2013-01-03 21:35:23

标签: knockout.js throttling

我希望我的油门是一个动态的数字,我可以随意改变,但似乎不可能。这是油门延长器的限制吗?

在我的情况下,我有一个网格过滤器,我正在限制。如果我在网格中只有几个项目,我想要一个非常低的油门。但是,如果网格行数非常大,我想改变它(可能最多约300ms)。 e.g:

this.filter = ko.observable("").extend({ throttle: 1 });

然后我想做类似的事情:

this.filter.extend.throttle = 300;

1 个答案:

答案 0 :(得分:4)

这对于内置油门方法无效。

自己构建这个并不难。例如,这里有一些代码可以让你在任何observable上调用.throttle,传递一个可以随意更改的节流时间:

ko.subscribable.fn.throttle = function(throttleTimeObservable) {
    var subscribable = this;
    var throttledObservable = ko.observable();
    var timeoutHandle = null;

    if (ko.isObservable(throttleTimeObservable)) {
       throttletimeObservable.subscribe(function() { clearTimeout(timeoutHandle) });
    }

    subscribable.subscribe(function(val) {
        clearTimeout(timeoutHandle);
        throttleTime = ko.utils.unwrapObservable(throttleTimeObservable);
        timeoutHandle = setTimeout(function() { throttledObservable(val); }, throttleTime);
    });

    return throttledObservable;
}

使用它很简单:

// Usage:
var existingObservable = ...;
var throttleTime = ko.observable(500);
var throttled = existingObservable.throttle(throttleTime);

// Change the throttle willy nilly!
throttleTime(1000);

如果你做了很多这样的事情(限制,组合不同的可观察者),你可能会对Rx.js感兴趣。