Eventos de backbone con comodines

¿Hay alguna manera de escuchar todos los events de un espacio de nombres? Entonces cuando escucho un evento como este:

app.vent.on('notification(:id)', function(type){console.lof(type)}) 

Escuchará todos los events le gusta esto:

 app.vent.trigger('notification:info') app.vent.trigger('notification:error') app.vent.trigger('notification:success') 

4 Solutions collect form web for “Eventos de backbone con comodines”

No. Backbone normalmente eventName evento general eventName , así como eventName:specifier event. Un ejemplo de esto es Model.change , que le permite escuchar todos los cambios, así como los cambios en los campos individuales:

 model.on('change', this.onAnyPropertyChanged); model.on('change:name', this.onNamePropertyChanged); 

Siguiendo este patrón en su código, puede activar sus events de la siguiente manera:

 app.vent.trigger('notification', 'info'); app.vent.trigger('notification:info'); 

Y escucha el evento general:

 app.vent.on('notification', function(type){ console.log(type); //-> "info" }); 

Como se menciona en esta respuesta, no es posible escuchar events con comodines. Pero como puedes escuchar all esto funcionará:

 vent.on('all', function(evenName, options) { var type = evenName.split(/notification:/)[1]; if (type) { console.log(type, options); } }); 

He escrito este ayudante:

 export default class EventsHelper { static triggerNamespacedEvent(eventBus, event, args) { event.split(':').networkinguce((previous, current) => { eventBus.trigger(previous, current); return `${previous}:${current}`; }); eventBus.trigger(event, args); } } 

Para usar esto en tu vista, harías:

 actionOne(argsOne){ EventsHelper.triggerNamespacedEvent(this, 'click:chart:one', argsOne); } actionTwo(argsTwo){ EventsHelper.triggerNamespacedEvent(this, 'click:chart:two', argsTwo); } 

Para escuchar estos events, harías:

 //Listen for all clicks this.listenTo(view, 'click', (args) => { console.log(`clicked something: ${args}`); //output: clicked something: chart }); //Listen for all chart clicks this.listenTo(view, 'click:chart', (args) => { console.log(`clicked chart: ${args}`); //output: clicked chart: one }); //Listen for fully qualified event this.listenTo(view, 'click:chart:two', (args) => { console.log(`clicked chart two: ${args}`); //output: clicked chart two: evtArgs }); 

Advertencia: escuchar los espacios de nombres de events en events personalizados puede que ya no funcionen. Por ejemplo, esto no funciona:

  @listenTo @app, 'session', -> console.log ".listenTo `session` triggenetworking" @listenTo @app, 'session:login_success', -> console.log ".listenTo `session:login_success` triggenetworking" @app.on 'session', -> console.log ".on `session` triggenetworking" @app.on 'session:login_success', -> console.log ".on `session:login_success` triggenetworking" 

Si disparo 'session: login_success' en @app , solo se @app los dos events específicos, no el espacio de nombres.

Problema relacionado con github: https://github.com/documentcloud/backbone/issues/2558

  • Comprender el ciclo de vida de Backbone y Marionette View
  • La forma correcta de filtrar un backbone.collection utilizando Marionette.CompositeView
  • Backbone.js vincula un evento de cambio a una colección dentro de un model
  • Enlace al evento de error de un model creado por collection.create ()?
  • ¿Phantom.js captura todo AJAX?
  • Método de syntax de llamada en CoffeeScript
  • Guardando el order de JQuery UI Sortable en la colección Backbone.js
  • Evento de clic de networking troncal que no se activa en la vista dinámica
  • Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.