如果你愿意,你可以在这里找到一些好的提示:
http ://www.knockmeout.net/2012/04/knockoutjs-performance-gotcha.html
更好的是,您可以在这里找到一个有趣的自定义对象实现,名为 pauseableObservableArray(伟大的名字:)来自一个巨大的开发人员:rpniemeyer) http://jsfiddle.net/rniemeyer/fYnjG/
除此之外,对于第一个简单的方法,您是否尝试从 DOM 中删除带有if
绑定的元素?
例如。html:
<!-- ko ifnot: isWorking -->
<div data-bind="foreach: blogs">
<span data-bind="text: id"></span>
</div>
<!-- /ko -->
视图模型:
function BlogViewModel() {
var self = this;
self.blogs = ko.observableArray([{id:'qwe'}]);
self.isWorking= ko.observable(false);
self.populateBlogs = function () {
self.isWorking(true);
var tmp = self.blogs();
for (var i = 0; i < 100000; i++) {
tmp.push({id:i});
}
self.blogs(tmp);
self.isWorking(false);
}
}
[更新] 可能,如果您需要改进更多的渲染时间,您需要实现类似于我建议的小提琴中实现的东西,或者实现自定义绑定处理程序来“手动”完成所有事情。例如,类似于:
html:
<div data-bind="quickForEach: blogs"></div>
视图模型:
ko.bindingHandlers.quickForEach = {
update: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var blogs = valueAccessor()();
var innerText='';
for (var i = 0; i < blogs.length; i++) {
//very dirty code!In production, concatenate strings in a smarter way
innerText += blogs[i].id;
}
$(element).text(innerText);
}
};