我有许多主干模型,按集合组织并连接到它们相应的视图和/或视图集合。其中一些不属于同一集合的模型需要触发另一个模型(可能不止一个)感兴趣的事件。
我认为,推荐的处理方法是这里和其他地方描述的“全局事件调度程序/聚合器” 。
但是,我也碰巧在使用 require.js,这似乎违背了将调度程序/聚合器附加到应用程序的命名空间对象的想法——或者我在这里错了吗?
所以我的问题是:使用 require.js 如何让多个不同的主干模型触发将由另一个模型处理的事件?
我有许多主干模型,按集合组织并连接到它们相应的视图和/或视图集合。其中一些不属于同一集合的模型需要触发另一个模型(可能不止一个)感兴趣的事件。
我认为,推荐的处理方法是这里和其他地方描述的“全局事件调度程序/聚合器” 。
但是,我也碰巧在使用 require.js,这似乎违背了将调度程序/聚合器附加到应用程序的命名空间对象的想法——或者我在这里错了吗?
所以我的问题是:使用 require.js 如何让多个不同的主干模型触发将由另一个模型处理的事件?
与@Andreas 提出的类似解决方案,但没有 Backbone.Marionette(尽管如此受到很大启发,请参阅问题中链接的文章)。
您所要做的就是定义一个模块,该模块创建一个事件侦听器的单例,并在您想要触发事件或侦听此事件的模块中要求该对象。
假设您有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');
});
我们使用 Marionettes app.vent
(它是我们应用程序的全局事件发送器)和 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);
}
})
})