首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一次更新大量可观测数据的性能淘汰技巧

一次更新大量可观测数据的性能淘汰技巧
EN

Stack Overflow用户
提问于 2013-06-20 00:46:24
回答 2查看 445关注 0票数 0

我正在使用这个计算,正如你可以想象的,当我点击selectAll时,所有的复选框都被选中(一个接一个),我认为可以进行优化,这样所有的复选框都会被选中,然后重新评估模型,但我不确定这是不可能的。

代码语言:javascript
复制
self.selectAllExpired = ko.computed({
                    read: function() {
                        return ko.utils.arrayFirst(self.paymentOrdersExpired(), function(order) {
                            return !order.isSelected();
                        }) == null;
                    },
                    write: function(value) {
                        ko.utils.arrayForEach(self.paymentOrdersExpired(), function(order) {
                            order.isSelected(value);
                        });
                    },
                    owner:this
                });
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-20 00:56:19

对于这种类型的场景,节流是一个很好的选择:http://knockoutjs.com/documentation/throttle-extender.html

即使使用添加到计算中的.extend({ throttle: 1 }),也会防止计算在您选中每个框时触发多个更新。

票数 1
EN

Stack Overflow用户

发布于 2013-06-20 05:58:35

下面是一个算法,当一个项的选择发生变化时,我用它来避免重新检查整个数组:

代码语言:javascript
复制
function getIsAllSelectedComputed(arrayObservable) {
    var unSelectedCount = ko.observable(), arrayVersion = 0;
    function updateSelectedCheck(arrayValue) {
        ++arrayVersion; // Whenever the array changes, increment the version
        var initialUnSelectedCount = 0;
        ko.utils.arrayForEach(arrayValue, function(item) {
            var previousValue = item.isSelected();
            if (!previousValue)
                initialUnSelectedCount++;
            if (!item._isSelectedSubVersion) {
                item.isSelected.subscribe(function(latestValue) {
                    if (item._isSelectedSubVersion === arrayVersion) {
                        // Only update the unSelectedCount if the "truthiness" has changed
                        if (Boolean(previousValue) ^ Boolean(latestValue))
                            unSelectedCount(unSelectedCount() + (latestValue ? -1 : 1));
                        previousValue = latestValue;
                    }
                });
            }
            item._isSelectedSubVersion = arrayVersion;
        });
        unSelectedCount(initialUnSelectedCount);
    }
    updateSelectedCheck(arrayObservable());
    arrayObservable.subscribe(updateSelectedCheck);

    return ko.computed({
        read: function() {
            return (unSelectedCount() === 0);
        },
        write: function(value) {
            ko.utils.arrayForEach(arrayObservable(), function(item) {
                item.isSelected(value);
            });
        }
    });    
}

示例:http://jsfiddle.net/mbest/ssEqj/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17196852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档