Скажем, мы имеем следующие данные
var data = {
facets: [{
name : "some name",
values: [{
value: "some value"
}]
}]
};
Мы можем легко представить это как модель представления, связанную с шаблоном нокаута следующим образом:
<ul data-bind="foreach: facets">
<li>
<span data-bind="text: name"></span>
<ul data-bind="foreach: values">
<li data-bind="text: value"></li>
</ul>
</li>
</ul>
Вопрос в том, как мы можем добиться того же результата при использовании прогрессивного улучшения? То есть, сначала визуализируя шаблон на стороне сервера, а затем привязывая шаблон нокаута и модель представления к этому рендерингу.
Простой шаблон на стороне сервера будет выглядеть примерно так:
<ul>
<li>
<span>some name</span>
<ul>
<li>some value</li>
</ul>
</li>
</ul>
Я изучил несколько разных возможностей:
-
Один из них создает один шаблон нокаута и один шаблон на стороне сервера и динамически генерирует модель представления нокаута, анализируя DOM для шаблона на стороне сервера. Таким образом, только шаблон нокаута будет виден, когда JavaScript включен, и только шаблон на стороне сервера будет виден, если JavaScript отключен. Их можно было бы создать так, чтобы они выглядели одинаково.
-
Другим подходом является применение привязок для каждого элемента массива граней отдельно к существующему элементу DOM для этой грани. Однако это все еще только один уровень глубины и не работает для вложенных элементов.
Ни один из этих подходов не выглядит довольно чистым. Другим решением может быть создание пользовательской привязки, которая обрабатывает весь рендеринг и повторно использует существующие элементы, если это возможно.
Любые другие идеи?