私は以下を使用しています:
- ノックアウト-2.1.0.js
- koExternalTemplateEngine_all.js
私が達成しようとしているのは次のとおりです。
- テンプレート コンテナは外部 HTML をロードし、その HTML 用の特定の VM をロードします (機能します)。
- テンプレート コンテナは、その HTML 用の他の特定の VM とともに、別の外部 HTML にロード/切り替えます (機能します)。
- テンプレート コンテナーは、VM と共に最初のテンプレート/VM に戻ります (動作しません!)。
うまくいかない理由は、テンプレートが VM の前に読み込まれるためだと思います (バインディング エラーが発生します)。
私のサイトの構造は次のとおりです(上記のライブラリを除く):
index.html
(テンプレート コンテナを保持)js/script.js
(メインの ViewModel を保持します)js/firstvm.js
(最初の ViewModel を保持します)js/secondvm.js
(2 番目の ViewModel を保持します)tmpl/firstvm.html
(最初の VM のテンプレート)tmpl/secondvm.html
(2 番目の VM のテンプレート)
最も重要な部分:
index.html
<button data-bind="click: loadFirstPage">Load first page + ViewModel</button> <button data-bind="click: loadSecondPage">Load second page + ViewModel</button> < hr /> <div data-bind="template: { name: function() { return currentTemplate(); }, data: currentData }"></div>
script.js
function IndexViewModel() { var vm = this; this.currentTemplate = ko.observable(); this.currentData = ko.observable(); this.loadFirstPage = function() { vm.currentTemplate("firstvm"); vm.currentData(new FirstViewModel()); }; this.loadSecondPage = function() { vm.currentTemplate("secondvm"); vm.currentData(new SecondViewModel()); }; this.loadFirstPage(); }; ko.applyBindings(new IndexViewModel());
firstvm.html
<p data-bind="text: displayValue"></p>
secondvm.html
<p data-bind="text: displayValue2"></p>
firstvm.js
function FirstViewModel() { this.displayValue = ko.observable("Text from firstvm.js"); };
secondvm.js
function SecondViewModel() { this.displayValue2 = ko.observable("Text from secondvm.js"); };
誰かがこれで私を助けてくれることを願っています。前もって感謝します!
Ps。言及するのを忘れました:「最初のページ」ボタンを2回押すと、機能しているように見えます(おそらく正しいVMがロードされているため)。