【发布时间】:2014-05-17 05:32:31
【问题描述】:
我有一个淘汰应用程序,其中有一个可写计算 Observable 的层次结构,如下所示:
function InvoiceVM() {
self.isSelected = ko.observable()
self.selectedAmount = ko.computed(function() {
if (self.isSelected())
return self.usdBalance;
else
return 0;
}
}
function CompanyVM() {
self.invoices = ko.observableArray()
self.totalSelectedAmount = ko.computed(function () {
var total = 0;
for (var i = 0; i < self.invoices().length; i++) {
total += self.invoices()[i].selectedAmount();
}
return total;
});
self.isSelected = ko.computed({
read: function () {
var isSelected = true;
for (var i = 0; i < self.invoices().length; i++) {
if (!self.invoices()[i].isSelected())
isSelected = false;
}
return isSelected;
},
write: function (value) {
for (var i = 0; i < self.invoices().length; i++)
self.invoices()[i].isSelected(value);
},
deferEvaluation: true,
owner: self
})
}
function ParentVM() {
self.companies = ko.observableArray()
self.isSelected = ko.computed({
read: function () {
var isSelected = true;
for (var i = 0; i < self.funds().length; i++) {
if (!self.companies()[i].isSelected()) {
isSelected = false;
break;
}
}
return isSelected;
},
write: function (value) {
for (var i = 0; i < self.companies().length; i++) {
var currentCompany = self.companies()[i];
for (var j = 0; j < currentCompany.invoices().length; j++)
currentCompany.invoices()[j].isSelected(value);
}
},
deferEvaluation: true
});
}
问题在于,当父VM 被选中时(通过复选框),渲染所有复选框并更新总金额需要 30-40 秒。大约有 4500 张发票和大约 274 家公司(但仅显示公司,使用 display:none 隐藏发票)。我尝试使用延迟更新插件(无论是否使用 deferEvaluation 选项)限制可观察对象的速率,通过 jQuery 手动选择复选框(这不适用于 2 路绑定)。有人对加快这个过程有什么建议吗?提前感谢您的帮助!
【问题讨论】:
-
考虑切换模板引擎。
-
另外,您可以修改底层数组和批量更改,然后在有帮助的情况下手动通知更改。
-
你推荐什么模板引擎?
-
这是个人喜好问题,起初,我会完全使用一些非常基本的东西(只是转储字符串),然后看看它是否会有所作为。