3

这篇文章

我首先建议您优化您的dependentObservable(又名computed)。当你读取任何 observable 时,Knockout 会在 Dependency Manager 中注册一个对它的依赖...

我可以在您的伪代码中看到您正在 while 循环中访问 this.ParentList() 。这意味着 registerDependency 将被调用 3000 次,并且依赖数组将被扫描 3000 次,这对 IE 不利(因为它没有内置的 Array.indexOf 方法)。

所以我的第一个建议是:在循环之前阅读所有的 observables。

考虑到这个好建议,这是我的问题:

observable使用 ko 实用方法(如下所示)遍历数组是不是很糟糕?[假设这this.mySelectListItems()是一个observableArray]:

self.selectedValuesCount = ko.computed(function () {
    var total = 0;
    ko.utils.arrayForEach(this.mySelectListItems(), function (item) {
        if (item.selected() === true) {
            total += 1;
        }
    });
    return total;
}, self);

换句话说,做以下事情有什么好处吗?

self.selectedValuesCount = ko.computed(function () {
    var total = 0;
    var myArray = this.mySelectListItems();
    ko.utils.arrayForEach(myArray, function (item) {
        if (item.selected() === true) {
            total += 1;
        }
    });
    return total;
}, self);
4

2 回答 2

4

不,这些代码是完全相等的。

如果您在移交给的回调中一次又一次地检索同一个可观察对象的值,您只会获得性能提升arrayForEach- 但在这种情况下,可观察数组的值只被检索一次,所以没有指出你为什么要将该数组放在一个额外的变量中。

于 2012-06-14T16:36:20.170 回答
2

你真的在经历性能打击吗?对于非常大的数据集,展开循环的可观察数组是有意义的,但如果你只有十几个左右,你应该没问题。此外,如果您正在对可观察数组本身进行更改(例如排序或删除元素),首先解开它会阻止任何数据绑定/订阅更新,因为您只是在修改常规数组。

请记住,过早的优化是万恶之源。

于 2012-06-14T16:38:24.903 回答