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);
}
})
})