KO:使用 ko 实用程序方法遍历可观察数组的形式不好吗?



来自这篇文章:

我首先建议您优化dependentObservable(又名 computed )。什么时候 您读取任何可观察的内容,Knockout 会在 依赖关系管理器...

我可以在您的伪代码中看到您正在访问此内容。父列表() 在 while 循环中。这意味着注册依赖项将被称为 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);

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

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

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

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

最新更新