ajax呼び出しをKnockoutViewModelに配置するのが賢明ですか、それとも代わりにモデルに配置する必要がありますか?私はいくつかのアプローチを考え出しましたが、どれも完全に正しいとは感じていません。
アプローチ1-ViewModelのみ
window.someDataVM = function() {
var self = this;
//used to enable loading indicator
self.pendingLoad = ko.observable(true);
self.myData = ko.observableArray();
self.load = function() {
//make ajax call and populate myData observable array
}
}
利点
- 最も単純なコード構造-保守が容易
短所
- データ取得のための再利用なし
アプローチ2-コールバックを使用したモデルとViewModel
window.someDataVM = function() {
var self = this;
//used to enable loading indicator
self.pendingLoad = ko.observable(true);
self.myData = ko.observableArray();
self.load = function() {
someDataM.load(function(data) {
//populate myData observable array
});
}
}
window.someDataM = function() {
return {
load: function(callback) {
//get data via ajax and return via callback
}
}
}
利点
データ取得でのコードの再利用の増加(つまり、someDataをロードするための1つの場所)
3に近づくよりシンプルなインターフェース
短所
- コールバックを使用します
アプローチ3-ノックアウトモデルを使用したモデルとビューモデル
window.someDataVM = function() {
var self = this;
//used to enable loading indicator
self.pendingLoad = ko.observable(true);
self.myData = ko.observableArray();
self.load = function() {
someDataM.load();
}
someDataM.isLoaded.subscribe(function(isLoaded) {
if (isLoaded) {
//populate observable array
}
});
}
window.someDataM = function() {
return {
isLoaded: ko.observable(false);
items: [],
load: function() {
//get some data, populate items, set isLoaded
}
}
}();
利点
- コールバックを使用しません
- データコードを一元化する
短所
- 多数のデータ入力ポイント(つまり、LoadById、LoadByNameなど)があると複雑になります