Knockout.js KO:使用KO实用方法迭代可观察数组是一种糟糕的形式吗?

Knockout.js KO:使用KO实用方法迭代可观察数组是一种糟糕的形式吗?,knockout.js,knockout-2.0,Knockout.js,Knockout 2.0,发件人: 首先,我建议您优化您的依赖项,使之成为可维护的(也称为计算的)。什么时候 你读到任何可观察到的,敲除注册一个依赖到它 依赖项管理器 我可以在您的伪代码中看到您正在访问这个 在while循环中。这意味着RegisterDependence将被称为3000 时间和依赖项数组将被扫描3000次,即 对IE不好(因为它没有内置的Array.indexOf方法) 因此,我的第一条建议是:在阅读之前阅读所有可观察到的内容 循环。 有了这个好建议,我的问题是: 使用ko实用程序方法(如下所示)迭代可

发件人:

首先,我建议您优化您的
依赖项,使之成为可维护的
(也称为
计算的
)。什么时候 你读到任何可观察到的,敲除注册一个依赖到它 依赖项管理器

我可以在您的伪代码中看到您正在访问这个 在while循环中。这意味着RegisterDependence将被称为3000 时间和依赖项数组将被扫描3000次,即 对IE不好(因为它没有内置的Array.indexOf方法)

因此,我的第一条建议是:在阅读之前阅读所有可观察到的内容 循环。

有了这个好建议,我的问题是:

使用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);

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


只有在您移交给
arrayForEach
的回调中一次又一次地检索同一个可观察数组的值,您才能获得性能提升-但在这种情况下,可观察数组的值只检索一次,因此,没有必要将该数组放入额外的变量中。

您是否真的遇到了性能问题?对于非常大的数据集来说,为循环展开可观察数组是有意义的,但如果您只有十几个,那么您应该可以。此外,如果您正在对可观察数组本身进行更改,例如排序或删除元素,则首先将其展开将阻止任何数据绑定/订阅更新,因为您只是在修改常规数组

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