Я исследовал несколько подходов, в том числе создание анонимного шаблона из первого элемента, как описано здесь:
http://groups.google.com/group/knockoutjs/browse_thread/thread/3896a640583763d7
или создание отдельных привязок для каждого элемента массива с помощью настраиваемой привязки, например
ko.bindingHandlers.prerenderedArray = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
var binding = valueAccessor();
binding.firstTime = true;
$(element).children().each(function(index, node) {
var value = ko.utils.unwrapObservable(binding.value)[index];
ko.applyBindings(value, node);
});
return { 'controlsDescendantBindings': true };
},
update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
var binding = valueAccessor();
if (binding.firstTime) {
binding.firstTime = false;
return;
}
$(element).children().remove();
ko.applyBindingsToNode(element, { template: { name: binding.template, foreach: binding.value }}, viewModel)
}
};
, который применяет определенную привязку к каждому элементу, а затем при первом обновлении заменяет содержимое обычной привязкой foreach. Этот подход все еще означает, что вам все еще нужно иметь два шаблона Оба из них также включают инициализацию состояния через JSON, отображаемый сервером.
Текущий подход, который я выбрал (все еще подлежащий изменению), заключается в том, чтобы поместить все шаблоны Knockout в теги сценария, чтобы они никогда не отображались в браузерах NoJS. Шаблоны NoJS отображаются как содержимое div на стороне сервера. Как только шаблон Knockout будет обработан, содержимое тега будет заменено шаблоном Knockout в тегах сценария. Вы можете стилизовать их одинаковыми / похожими способами, чтобы сделать переход плавным, а если это невозможно, скрыть шаблон noJS с помощью CSS.
В конце концов, я пришел к выводу, что Knockout.js и прогрессивное улучшение на самом деле не очень хорошо работают вместе, нужно выбрать другой, то есть создать некоторые части приложения, которые требуют прогрессивного улучшения, используя более традиционные методы. такие прямые манипуляции с JQuery DOM.