Я экспериментировал с производительностью и имею два вклада, которые, я надеюсь, могут быть полезны.
Мои эксперименты сосредоточены на времени манипуляции DOM. Поэтому, прежде чем углубляться в это, определенно стоит следовать приведенным выше пунктам о вставке в массив JS, прежде чем создавать наблюдаемый массив и т. Д.
Но если время манипуляции с DOM все еще мешает, то это может помочь:
1: шаблон, который оборачивает загрузочный счетчик вокруг медленного рендера, а затем скрывает его с помощью afterRender
http://jsfiddle.net/HBYyL/1/
Это на самом деле не является решением проблемы производительности, но показывает, что задержка, вероятно, неизбежна, если вы перебираете тысячи элементов и используете шаблон, в котором вы можете убедиться, что у вас есть загрузочный счетчик перед длительной операцией KO , а затем скрыть это. Так что это улучшает UX, по крайней мере.
Убедитесь, что вы можете загрузить счетчик:
// Show the spinner immediately...
$("#spinner").show();
// ... by using a timeout around the operation that causes the slow render.
window.setTimeout(function() {
ko.applyBindings(vm)
}, 1)
Скрыть прядильщик:
<div data-bind="template: {afterRender: hide}">
который вызывает:
hide = function() {
$("#spinner").hide()
}
2: Использование привязки html в качестве хака
Я вспомнил старую технику, когда я работал над телевизионной приставкой в Opera, создавая пользовательский интерфейс с использованием манипуляций с DOM. Это было ужасно медленно, поэтому решение состояло в том, чтобы хранить большие куски HTML в виде строк и загружать строки, устанавливая свойство innerHTML.
Нечто похожее можно достичь с помощью привязки html и вычисления, которое выводит HTML-код для таблицы как большой кусок текста, а затем применяет его за один раз. Это решает проблему производительности, но существенным недостатком является то, что это сильно ограничивает то, что вы можете делать с привязкой внутри каждой строки таблицы.
Вот скрипка, демонстрирующая этот подход, вместе с функцией, которую можно вызывать из строк таблицы, чтобы удалить элемент неопределенно-но-подобным способом. Очевидно, что это не так хорошо, как правильный KO, но если вам действительно нужна высокая производительность, это возможный обходной путь.
http://jsfiddle.net/9ZF3g/5/