2012-02-21 53 views
7

有沒有任何選項可以在淘汰賽中暫停和恢復綁定?在knockout.js中掛起綁定1.2.1

版本:1.2.1 knockout.js

我們需要暫停綁定從以下莖。在一些操作過程中,我們必須從服務器加載大量數據,例如多個選擇將他們的全部數據更改,有些表的行會動態添加等。

現在,在當前這種情況下,表單已完全綁定視圖模型。當我們清除組合並添加每個項目時,視圖被刷新,因此存在顯着的延遲。如果我有辦法暫停綁定,則可以暫停,然後將所有數據加載到視圖模型中,然後再次恢復綁定。

回答

7

我不認爲有一種方法可以在knockout.js中掛起綁定。沒有看到代碼就很難說,但這種緩慢可能是由於您通過清除它們並逐個添加新項目來刷新observableArrays而造成的。相反,你可以刷新整個數組一次:

... 
self.manyItems = ko.observableArray(); 
... 
function refreshItems(newItems){ 
    self.manyItems(newItems); 
} 
+0

是!這是一個很好的建議!! ..我會嘗試一下,並將其標記爲答案,一旦我檢查出我的代碼! – 2012-02-21 18:34:20

+0

我發現這是最好的方法。謝謝! – CoderDennis 2012-10-02 13:54:45

5

掛起和恢復是可能的:看看this demo由瑞恩·尼邁耶放在一起。有關更多背景信息,請參閱他的博客上的this entry

+0

這是一個好方法。 – 2012-06-26 15:00:27

0

如果你真的需要暫停訂閱,我找到了一種方法來暫停他們在計算observable與pauseableComputed(從this site採取的想法)。我修改了一下,添加了pauseableComputed具有讀寫功能的能力。

viewModel.myComputedObservable = ko.pauseableComputed(function() { 
    return myResult; 
}, viewModel); 

對於暫停,你叫myComputedObservable.pause();,讓你所有的修改,然後調用myComputedObservable.resume();對於那些修改觸發訂閱的計算觀察到的。

//wrapper for a computed observable that can pause its subscriptions 
     ko.pauseableComputed = function (evaluatorFunction, evaluatorFunctionTarget) { 
      var _cachedValue = ""; 
      var _isPaused = ko.observable(false); 

      //the computed observable that we will return 
      var result; 
      if (evaluatorFunction.read) { 
       result = ko.computed({ 
        read: function() { 
         if (!_isPaused()) { 
          //call the actual function that was passed in 
          return evaluatorFunction.read.call(evaluatorFunctionTarget); 
         } 
         return _cachedValue; 
        }, 
        write: function(value) { 
         if (!_isPaused()) { 
          //call the actual function that was passed in 
          return evaluatorFunction.write.call(evaluatorFunctionTarget, value); 
         } 
         return _cachedValue; 
        } 
       }, evaluatorFunctionTarget); 
      } else { 
       result = ko.computed(function() { 
        if (!_isPaused()) { 
         //call the actual function that was passed in 
         return evaluatorFunction.call(evaluatorFunctionTarget); 
        } 
        return _cachedValue; 
       }, evaluatorFunctionTarget); 
      }