我一直在使用骨干,我很快发现我做的事情变得太乏味和重复。
我将拥有多个骨干视图,每个视图都有一个模型,可以调用api来获取数据。一旦完成,我想渲染结果。但是,很简单,我必须将来自其他来源(消息传递系统)的每个模型数据附加到
//this corresponds to the view
$.when(this.model.fetch(), this.msg.fetch()).done((result1, result2) => {
this.model.set('msg', this.msgtoJSON(), { silent: true });
this.renderTemplate(template, this.model.toJSON());
});
这很有效,但到处都重复了。我有几十个和几十个观点。这也阻止了我在主模型上附加更改事件的对象侦听器,以便可以重新呈现模板。
在获取这些模型时,是否有人建议如何异步获取此消息传递依赖关系并将其注入我的主干模型?
答案 0 :(得分:2)
您可以让它们依赖,合并两个模型的 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 将失败,并且您将在合并的承诺上设置fail
回调,则只要其中一个模型'获取失败了。如果您需要为每个模型的失败案例单独做一些工作人员,您需要在合并后的承诺之前将它们附加到模型的提取中。
PS。我还没有测试过这段代码,所以如果出现问题,请告诉我。