underscore libreria framework findwhere empty chunk backbone backbone.js requirejs eventaggregator

backbone.js - libreria - underscore empty object



backbone.js+global event dispatcher+require.js: how-to? (2)

Tengo una serie de modelos de backbone, organizados en colecciones y conectados a sus vistas correspondientes y / o colecciones de vistas. Algunos de estos modelos que no pertenecen a la misma colección deben desencadenar un evento que sea de interés para otro modelo (y quizás más de uno).

La forma recomendada de lidiar con esto es, según creo, el "agregador / agregador de eventos globales" tal como se describe here y en otros lugares.

Sin embargo, también estoy utilizando require.js, que parece ir en contra de la idea de adjuntar el despachador / agregador al objeto de espacio de nombres de la aplicación, ¿o me equivoco aquí?

Así que mi pregunta es: usar require.js ¿cómo puedo hacer que varios modelos de backbone diferentes activen un evento que será manejado por otro modelo?


Una solución similar a la que propuso @Andreas pero sin Backbone.Marionette (sin embargo, muy inspirada, here ).

Todo lo que tienes que hacer es definir un módulo que crea un singleton de un detector de eventos y requiere este objeto en los módulos en los que deseas activar un evento o escuchar este evento.

Digamos que tienes app / channel.js definiendo tu canal

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

A continuación, puede utilizarlo como un oyente a través de

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

y puedes activar un evento en este canal a través de

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


Usamos Marionettes app.vent (que es el transmisor de eventos global para nuestra aplicación), junto con require js y funciona muy bien.

aplicación

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

Modelo 1

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

Modelo 2

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