タイトルに記載されているコンポーネントで構成されるプロジェクトの特定の部分に行き詰まっています。
私は現在、私が望むように機能する概念実証を持っています:
- Sammy はノックアウト ビューモデルに統合されています (ノックアウト サイトのチュートリアルに従って)。
- ビューはコントローラーによってオンデマンドで読み込まれます (そのため、アプリケーション ページですべてのビューを定義する必要はありません)。
私の現在の状況では、アプリケーションの起動時にビューモデルをインスタンス化します (インスタンス化しない場合、Sammy はルーティングを処理しません)。問題は、Sammy がビューをロードしてスワップする場所です。KO をビューにバインドするには、ko.applyBindings を呼び出す必要があります。しかし、適用を繰り返し呼び出すのは悪い習慣です。
質問ですが、オンデマンドで読み込まれるビューにバインドするにはどうすればよいですか? ビューが複数回読み込まれるとメモリリークが発生するため、 ko.applybindings を呼び出すことはできません。
問題のある ko.applyBindings を持つ VM の例を次に示します。
function serviceInfoVm() {
var self = this;
self.ObjectKey = ko.observable();
self.Service = ko.observable();
self.LoadService = function () {
$.get('ServiceData/Detail', { serviceId: self.ObjectKey() }, function (data) {
self.Service(data);
});
};
$.sammy('#content', function () {
this.get('#/service/:id', function (context) {
var ctx = context;
self.ObjectKey(this.params['id']);
self.LoadService();
$.get('Content/ServiceInfo', function (view) {
ctx.app.swap(view);
ko.applyBindings(self);
});
});
}).run();
};
この問題へのポインタや解決策を持っている人はいますか?