ああ、それは簡単です。applyBindings
Knockout JS のメソッドは、オプションの DOM 要素を 2 番目のパラメーターとして受け入れます。したがって、あなたの場合、次のようなことができます:
ko.applyBindings(myViewModel,
document.getElementById('myModuleWrapperDiv'));
ko.applyBindings(otherViewModel,
document.getElementById('otherModuleWrapperDiv'));
唯一の問題は、1 つの DOM サブツリーで 2 つのビュー モデルのバインディングを組み合わせて一致させることができないことです。たとえば、次のマークアップが機能します。
<div id="myModuleWrapperDiv">
...
</div>
<div id="otherModuleWrapperDiv">
...
</div>
ただし、これは次のことにはなりません。
<div id="myModuleWrapperDiv">
...
<div id="otherModuleWrapperDiv">
...
</div>
</div>
Knockout でウィジェットを作成する方法を次に示します。95% のケースでは、単純にテンプレートを読み込んでバインディングを適用するだけで問題ないことに注意してください。ただし、パッケージ化されたウィジェット (つまり、別のコンポーネントとしてリリースするもの) が必要な場合は、それをカスタム バインディングでラップするのが最善の方法です。Angular JS は、そのディレクティブで同様のアプローチを推進しています。
ウィジェットのマークアップをドキュメント フラグメントとして設計します。HTML の簡単なビット、div
すべてのレンダリングと対話が JavaScript で行われるプレースホルダーなど、好きなように実行できます。
テンプレートのビュー モデルを設計します。ウィジェットがそれに従ってモデルをレンダリングおよび操作し、構築するために必要となる可能性のあるデータを考えてみてください。
ウィジェットのカスタム バインディングを作成します。最も簡単なのは、プレースホルダーdiv
要素に配置することです。
を。メソッドinit
はテンプレートをロードし、内部ウィジェット ビュー モデルのバインディングをテンプレートに適用する必要があります。バインディングが適用された後、結果のドキュメント フラグメントをプレースホルダーに追加できますdiv
。
b. update メソッドは、カスタム バインディング属性パラメーターを介して提供される値に基づいて、内部ビュー モデルの状態を変更する必要があります。