必要に応じて、ここでいくつかの良いヒントを見つけることができます:
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);
}
};