我是not first人ask这个...答案主要是说“你做错了你做错了。”很公平,但开发充满了权衡,我经常发现自己 无法重写API。
继续讨论手头的问题,为模型添加某种资源的方法最优雅的方法是什么?
var Issue = can.Model.extend({
findAll: 'GET Issues',
findOne: 'GET Issues/{id}',
findRelated: can.Model.makeFindAll(function(params) {
return can.ajax({
type: 'GET',
url: 'Issues/'+params.id+'/'
});
})
},{});
答案 0 :(得分:2)
如果我正确理解了这个问题,您希望从findRelated获得Issue.List
。
var Issue = can.Model.extend({
findAll: 'GET Issues',
findOne: 'GET Issues/{id}',
findRelated: function(params) {
var deferred = new can.Deferred();
can.ajax({
type: 'GET',
url: 'Issue/'+params.id+'/Related'
}).then(function(response) {
// success
deferred.resolve(Issue.models(response || []));
}, function(xhr, textStatus, err) {
// failure
deferred.reject(err);
});
return deferred;
}
},{});
答案 1 :(得分:1)
与接受的答案类似,另一个选项是返回can.ajax
而不是创建新的延迟。它的冗长程度稍微低一些。
此外,从v2.1开始,将响应直接传递给.models
为deprecated,并首先使用.parseModels
进行转换。
var Issue = can.Model.extend({ findAll: 'GET Issues', findOne: 'GET Issues/{id}', findRelated: function(issue) { return can.ajax({ type: 'GET', url: 'Issue/'+issue.id+'/Related' }).then(function(response) { return this.models(this.parseModels(response)); }.bind(this)); } },{ findRelated: function() { return this.constructor.findRelated(this); } }); // usage examples // 1. Issue.findRelated({id: 1}); // 2. new Issue({id: 1}).findRelated();