我正在使用淘汰赛,并试图保持MVVM结构的真实性并试图让对象彼此依赖。
这是我现在拥有的,温柔的,我还在学习:
Model,ViewModel,服务定义:
var App = window.App || {};
(function(ns, $, ko) {
ns.Models = {};
ns.ViewModels = {};
ns.Services = ns.Services || {};
//Service def
ns.Services.SearchService = function() {
this.SearchByName = function(name, callback) {
$.get("/api/SearchByName/" + name, function(d){
callback(d);
});
};
};
//Model Def
ns.Models.SearchResultModel = function(json) {
var self = this;
ko.mapping.fromJS(json, {}, self);
};
//ViewModel def
ns.ViewModels.SearchResultsViewModel = function() {
var self = this;
self.dataService = new ns.Services.SearchService();
self.SearchResults = ko.observableArray();
self.GetSearchResultsByName = function(name){
self.dataService.SearchByName(name, function(d) {
$.each(d, function(i, e) { self.SearchResults.push(new ns.Models.SearchResultModel(e)); });
});
};
};
}(App, jQuery, ko));
我现在可以这样使用它:
var vm = new App.ViewModels.SearchResultsViewModel();
vm.GetSearchResultsByName("Doe");
ko.applyBindings(vm, document.getElementById("search-results-form"));
这只是我的出发点,似乎ko.applyBindings(...)
应该在某个地方的ViewModel中。
尽管如此,我是朝着正确的方向前进,还是我完全离开了?
答案 0 :(得分:1)
没什么不寻常的。这是一个很难回答的问题,因为如果不是你做错了什么,就没什么好说的了......
我注意到的一件事是
$.get("/api/SearchByName/" + name, function(d){
callback(d);
});
应替换为
$.get("/api/SearchByName/" + escape(name)).done(callback);
name
应该被转义,因为它可能包含无效的URL字符,并且没有理由包装回调。 (通常,表达式function (x) { f(x) }
只是在简单表达式f
中添加不必要的间接。)
在GetSearchResultsByName
函数中,一个比d
更具描述性的名称会很好,特别是因为你在其他地方的命名如此冗长。