,如果你願意,你可以找到幾個很好的提示的位置: 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);
}
}
[更新] 也許,如果你需要提高更多的渲染時間,你需要實現類似於在fiddle我建議實施的東西,或者實現一個自定義綁定處理器來「手工」完成所有的事情。
HTML:
<div data-bind="quickForEach: blogs"></div>
viemodel: 例如,類似的東西
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);
}
};
嗨。感謝你的回答。我正在尋找一種方法來保存一個巨大的繩子,然後只給他加一次。在我的網站上,我看到了與大型數組的競爭 - 我通過從服務器分頁來減少數組,但你仍然會看到渲染需要很長時間。感謝您的回答 – Ram
在淘汰賽中是否有一種方法可以使用多個模板引擎? – Ram
我已經更新了Underscore示例以使用'templateEngine'選項,它支持這個選項:http://jsfiddle.net/6pStz/340/ –