我一直在和骨干一起工作,我很快就发现我正在做的事情变得过于乏味和重复。
我将有多个主干视图,其中每个视图都有一个模型,该模型调用一个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());
});这是可行的,但在任何地方都是重复的。我对此有几十种看法。这也使我无法在主模型上附加更改事件的对象侦听器,这样模板就可以重新呈现。
有人对我如何异步地获取这个消息依赖并在获取这些模型时注入到我的骨干模型有什么建议吗?
发布于 2014-11-26 08:01:33
您可以使它们相互依赖,合并两个模型的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回调设置为合并承诺,那么当模型的fetch失败时,它就会触发。如果您需要为每个模型的失败案例分别做一些工作人员,则需要在合并承诺之前将它们附加到模型的fetch上。
PS。我还没有测试过这段代码,所以如果有什么问题,请告诉我。
https://stackoverflow.com/questions/27141666
复制相似问题