挂起knockout.js 1.2.1中的绑定

挂起knockout.js 1.2.1中的绑定,knockout.js,knockout-1.2,Knockout.js,Knockout 1.2,在knockout中是否有挂起和恢复绑定的选项 版本:knockout.js 1.2.1 我们对挂起绑定的需求来自以下方面。在某些操作中,我们必须从服务器加载大量数据,例如,多个选择更改了其全部数据,有些表的行是动态添加的,等等 现在在当前场景中,表单与视图模型完全绑定。当我们清除组合并添加每个项目时,视图将被刷新,因此存在明显的延迟。如果我有办法挂起绑定,我可以挂起,然后将所有数据加载到viewmodel中,然后再次恢复绑定。我认为没有办法在knockout.js中挂起绑定。如果看不到代码,很

在knockout中是否有挂起和恢复绑定的选项

版本:knockout.js 1.2.1

我们对挂起绑定的需求来自以下方面。在某些操作中,我们必须从服务器加载大量数据,例如,多个选择更改了其全部数据,有些表的行是动态添加的,等等


现在在当前场景中,表单与视图模型完全绑定。当我们清除组合并添加每个项目时,视图将被刷新,因此存在明显的延迟。如果我有办法挂起绑定,我可以挂起,然后将所有数据加载到viewmodel中,然后再次恢复绑定。

我认为没有办法在knockout.js中挂起绑定。如果看不到代码,很难说,但是速度慢可能是因为您通过清除它们并逐个添加新项目来刷新您的observableArrays。相反,您可以一次刷新整个阵列:

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

暂停和恢复是可能的:看看Ryan Niemeyer的《拼凑》。有关更多背景信息,请参阅他的博客。

如果您真的需要暂停订阅,我找到了一种方法,可以使用pauseableComputed在计算的观测值中暂停订阅(这一想法来源于)。我对它做了一点修改,添加了pauseableComputed的读写功能

viewModel.myComputedObservable = ko.pauseableComputed(function() {
    return myResult;
}, viewModel);
对于暂停,可以调用
mycomputerdobservable.pause()
,进行所有修改,然后调用
mycomputerdobservable.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);
            }

是的!!这是个好建议!!。。一旦我在我的代码上签出它,我会尝试并将它标记为答案!!我发现这是最好的方法。谢谢