次のようなデータがあるとしましょう
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>
私はいくつかの異なる可能性を探求しました:
1つは、1つのノックアウトテンプレートと1つのサーバー側テンプレートを作成し、サーバー側テンプレートのDOMを解析することによって動的にノックアウトビューモデルを生成することです。このように、JavaScriptが有効になっている場合はノックアウトテンプレートのみが表示され、JavaScriptが無効になっている場合はサーバー側のテンプレートのみが表示されます。それらは、同じように見えるようにスタイルを設定できます。
別のアプローチは、ファセット配列内の各アイテムのバインディングを、そのファセットの既存のDOM要素に個別に適用することです。ただし、これはまだ1レベルの深さであり、ネストされた要素では機能しません。
これらのアプローチはどちらもかなりクリーンではないようです。別の解決策は、レンダリング全体を処理し、可能であれば既存の要素を再利用するカスタムバインディングを作成することです。
他のアイデアはありますか?