16

我有许多主干模型,按集合组织并连接到它们相应的视图和/或视图集合。其中一些不属于同一集合的模型需要触发另一个模型(可能不止一个)感兴趣的事件。

我认为,推荐的处理方法是这里和其他地方描述的“全局事件调度程序/聚合器” 。

但是,我也碰巧在使用 require.js,这似乎违背了将调度程序/聚合器附加到应用程序的命名空间对象的想法——或者我在这里错了吗?

所以我的问题是:使用 require.js 如何让多个不同的主干模型触发将由另一个模型处理的事件?

4

2 回答 2

35

与@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');
});
于 2012-09-13T11:42:00.543 回答
1

我们使用 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);
    }
  })
})
于 2012-09-13T09:59:38.167 回答