2012-02-21 24 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); 
      }