2014-12-03 23 views
2

在淘汰賽,你可以做到以下幾點:將多個淘汰訂閱整理成單個通知?

myObservable.subscribe(function(newValue){ doSomething(); });

現在,如果我有多個觀測我想訂閱上我可以這樣做:

myObservable1.subscribe(function(){ doSomething(); }); myObservable2.subscribe(function(){ doSomething(); });

然而,這能有點難看當我有很多訂閱,並且如果你想限制當前的更新機制,你將不得不按照訂閱進行。

那麼有沒有辦法讓我以某種方式包裝它們?即

ko.subscribeToMany(myObservable1, myObservable2) .throttle(500) .subscribe(function(){ doSomething() });

我遇到的情況,我基本上要刷新基於變化的圖表,其相當耗費資源,所以我希望,而不是訂閱數據我所能的每個動態位將它們整理成單個計算式樣訂閱,然後從那裏限制個人訂閱,因爲其他訂閱可能希望立即得到通知而沒有延遲/節流。

所以上述可能與Knockout?

+0

你所需要的'newValue'參數,或者只是想得到通知? – haim770 2014-12-03 14:09:27

+0

在這種情況下,我不在乎newValue,我只是想知道什麼時候發生了對底層數據的更改。但是我相信在這種情況下其他人可能需要訪問已經改變的觀測值,但是不要讓這個觀測值複雜化。 – Grofit 2014-12-03 14:11:39

回答

2

快速實行可能是以下幾點:

ko.obsgroup = function() { 

    var groupManager = {};  
    var observables = []; 

    var throttle = 0; 
    var throttleTimeout; 

    for(var i = 0; i < arguments.length; i++) { 
     observables.push(arguments[i]); 
    } 

    groupManager.throttle = function(duration) { 
     throttle = duration; 
     return groupManager; 
    }; 

    groupManager.subscribe = function(handler) { 

     function throttledHandler(val) { 
      if(throttle > 0) { 
       if(!throttleTimeout) { 
        throttleTimeout = setTimeout(function() { 
         throttleTimeout = undefined; 
         handler(val); 
        }, throttle); 
       } 
      } else { 
       handler(val); 
      } 
     } 

     for(var i = 0; i < arguments.length; i++) { 
      observables[i].subscribe(throttledHandler); 
     } 
     return groupManager; 
    }; 

    return groupManager; 
}; 

用法:

var vm = { 
    v1: ko.observable(0), 
    v2: ko.observable(0), 
    v3: ko.observable(0), 
    log: ko.observable(0) 
}; 

ko.obsgroup(vm.v1, vm.v2, vm.v3) 
    .throttle(1000) 
    .subscribe(function(val) { 
     vm.log('changed: ' + Date.now()); 
    }); 

ko.applyBindings(vm); 

演示:JSFiddle

+0

啊,所以你基本上是在外包裝訂閱,然後只在一定的油門後委託。除非有人提出更好的方法,否則現在會給你答案。 – Grofit 2014-12-03 15:49:06

+0

這也是如何在淘汰賽中完成限制值更新。但是,此處限制適用於更改通知。 – manji 2014-12-03 16:10:56