3

スロットルを自由に変更できる動的な数値にしたいのですが、それは不可能のようです。これはスロットルエクステンダーの制限ですか?

私の場合、調整しているグリッドフィルターがあります。グリッドに少数のアイテムしかない場合は、非常に低いスロットルが必要です。ただし、グリッドの行数が非常に大きくなった場合は、それを変更したいと思います (おそらく最大 300 ミリ秒まで)。例えば:

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

その後、次のようなことをしたいと思います。

this.filter.extend.throttle = 300;
4

1 に答える 1

4

これは、組み込みのスロットル メソッドでは機能しません。

これを自分で構築するのは難しくありません。たとえば、任意のオブザーバブルで .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に興味があるかもしれません。

于 2013-01-08T16:48:54.467 に答える