来自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);
答案 0 :(得分:4)
不,这些代码完全相同。
如果你在移交给arrayForEach
的回调中一次又一次地检索相同observable的值,你只会获得性能提升 - 但在这种情况下,可观察数组的值得到只检索一次,所以没有必要为什么要将该数组放在一个额外的变量中。
答案 1 :(得分:2)
您实际上是否遇到了性能损失?解开一个循环的可观察数组对于非常大的数据集是有意义的,但是如果你只有十几个那么你应该没问题。此外,如果您正在对可观察数组本身进行更改(例如排序或删除元素),则首先解包它会阻止任何数据绑定/订阅更新,因为您只需要修改常规数组。
请记住,过早优化是万恶之源。