KO:使用ko实用程序方法迭代可观察数组是不好的形式?

时间:2012-06-14 16:20:48

标签: knockout.js knockout-2.0

来自this post

  

我建议您优化dependentObservable(a.k.a。computed)。什么时候   你读了任何observable,Knockout注册了一个依赖项   依赖管理器......

     

我可以在你的伪代码中看到你正在访问this.ParentList()   在while循环中。这意味着registerDependency将被称为3000   时间和依赖项数组将被扫描3000次,这是   IE很糟糕(因为它没有内置的Array.indexOf方法)。

     

所以我的头号建议是:之前阅读所有可观察的内容   环路。

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

用ko实用程序方法(如下所示)迭代observable数组是不好的形式? [假设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);

2 个答案:

答案 0 :(得分:4)

不,这些代码完全相同。

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

答案 1 :(得分:2)

您实际上是否遇到了性能损失?解开一个循环的可观察数组对于非常大的数据集是有意义的,但是如果你只有十几个那么你应该没问题。此外,如果您正在对可观察数组本身进行更改(例如排序或删除元素),则首先解包它会阻止任何数据绑定/订阅更新,因为您只需要修改常规数组。

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