将您的 ajax 调用放在您的 Knockout ViewModel 中是否明智,还是应该将其放在模型中?我想出了一些方法,但没有一个感觉完全正确。
方法 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 - 带有回调的模型和视图模型
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)
接近 3 的更简单的界面
缺点
- 使用回调
方法 3 - 带有 Knockout 模型的模型和 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();
}
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 等)会很复杂