您可以使它们相互依赖,合并两个模型的 fetch。它会破坏Backbone.Model.fetch 的一些原生实现,但会帮助您避免代码重复。一种非规范化来规范化。
var Slave = Backbone.Model.extend({
urlRoot: 'first/api',
defaults: {
val1: '',
val2: ''
}
});
var Master = Backbone.Model.extend({
initialize: function(options) {
this.slave = options.slave;
},
urlRoot: 'second/api',
fetch: function(options) {
var that = this,
masterPromise = this.constructor.__super__.fetch.call(this, options);
if (this.slave) {
return $.when(masterPromise, this.slave.fetch()).done(function(result1, result2){ //merged promise
that.set('msg', that.slave.toJSON(), { silent: true });
});
}
return masterPromise;
}
});
然后:
var slave = new Slave(),
master = new Master({ slave: slave });
master.fetch().done(function(){
// render template here.
})
此实现适用于两种情况,无论有无从属模型。
注意事项
1.如果你处理成功回调来渲染模板:
master.fetch({success: function() { // rendering here}});
在这种情况下'msg' 将是未定义的,因为success 不会等待奴隶的承诺。您需要避免使用success。
2.如果模型的 fetch 之一失败,并且您将在合并的 Promise 上设置 fail 回调,它将在模型的其中一个提取失败时触发。如果您需要为每个模型的失败案例单独做一些工作人员,您需要在合并承诺之前将它们附加到模型的 fetch 中。
附言。我还没有测试过这段代码,所以如果有问题请告诉我。