假设我们有如下数据
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>
我探索了几种不同的可能性:
一种是创建一个knockout模板和一个服务器端模板,通过解析服务器端模板的DOM动态生成Knockout视图模型。这样,启用 JavaScript 时只有 Knockout 模板可见,禁用 JavaScript 时只有服务器端模板可见。它们的样式可以使它们看起来相同。
另一种方法是将 facets 数组中每个项目的绑定分别应用于该 facet 的现有 DOM 元素。然而,这仍然只有一层深,不适用于嵌套元素。
这些方法似乎都不是很干净。另一种解决方案可能是编写一个自定义绑定来处理整个渲染并在可能的情况下重用现有元素。
还有其他想法吗?