我有许多骨干模型,按集合进行组织并连接到相应的视图和/或视图集合。其中一些不属于同一集合的模型需要触发另一个模型(可能不止一个)感兴趣的事件。
我认为,推荐的解决方法是here和其他地方所说的“全球事件调度员/聚合器”。
但是,我也碰巧使用require.js,这似乎违背了将调度程序/聚合器附加到应用程序的命名空间对象的想法 - 或者我在这里错了吗?
所以我的问题是:使用require.js我怎样才能有一些不同的骨干模型触发一个由另一个模型处理的事件?
答案 0 :(得分:35)
@Andreas提出的类似解决方案,但没有Backbone.Marionette(尽管有很大的启发,see the article linked in the question)。
您所要做的就是定义一个模块,该模块创建一个事件监听器的单例,并在要触发事件或听取此事件的模块中需要此对象。
假设你有 app / channel.js 定义你的频道
define(['backbone', 'underscore'], function (Backbone, _) {
var channel = _.extend({}, Backbone.Events);
return channel;
});
然后,您可以通过
将其用作侦听器require(['app/channel'], function (channel) {
channel.on('app.event', function () {
console.log('app.event');
});
});
您可以通过
触发此频道的活动require(['app/channel'], function (channel) {
channel.trigger('app.event');
});
答案 1 :(得分:1)
我们使用Marionettes app.vent
(我们的应用程序的全局事件发送器),allong with require js,它运行得非常好。
应用强>
define(, function(){
return new Backbone.Marionette.Application();
})
<强>型号1 强>
define(['app'], function(app){
return Backbone.Marionette.Model.extend({
initialize: function(){
this.bindTo('app.vent', 'create:model2', this.toSomething, this);
}
})
})
<强>模型2 强>
define(['app'], function(app){
return Backbone.Marionette.Model.extend({
initialize: function(){
app.vent.trigger('create:model2', this);
}
})
})