16
votes

I have a number of backbone models, organized in collections and connected to their corresponding views and/or collections of views. Some of these models that do not belong to the same collection need to trigger an event which is of interest to another model (and maybe more than one).

The recommended way to deal with this is, I think, the "global event dispatcher/aggregator" as described here and other places.

However, I also happen to be using require.js, which seems to go against the idea of attaching the dispatcher/aggregator to the application's namespace object -- or am I wrong here?

So my question is: using require.js how can I have a number of different backbone models trigger an event that will be handled by another model?

2

2 Answers

35
votes

A similar solution to what @Andreas proposed but without Backbone.Marionette (heavily inspired nonetheless, see the article linked in the question).

All you have to do is to define a module that creates a singleton of an event listener and require this object in the modules where you want to trigger an event or listen to this event.

Let's say you have app/channel.js defining your channel

define(['backbone', 'underscore'], function (Backbone, _) {
    var channel = _.extend({}, Backbone.Events); 
    return channel;
});

You can then use it as a listener via

require(['app/channel'], function (channel) {
    channel.on('app.event', function () {
        console.log('app.event');
    });
});

and you can trigger an event on this channel via

require(['app/channel'], function (channel) {
    channel.trigger('app.event');
});
1
votes

We using Marionettes app.vent (which is the global event transmitter for our application), allong with require js and it works really well.

app

define(, function(){
  return new Backbone.Marionette.Application();
})

Model1

define(['app'], function(app){
  return Backbone.Marionette.Model.extend({
    initialize: function(){
      this.bindTo('app.vent', 'create:model2', this.toSomething, this);
    }
  })
})

Model2

define(['app'], function(app){
  return Backbone.Marionette.Model.extend({
    initialize: function(){
      app.vent.trigger('create:model2', this);
    }
  })
})