2016-01-23 20 views
5

Qual è un buon metodo per inviare un messaggio da una vista Figlio alla sua vista Raccolta genitore in Backbone.js o Marionettejs?Qual è un buon metodo per inviare un messaggio da una vista Figlio alla sua vista Raccolta genitore in Backbone.js o Marionette.js?

Normalmente inviare il messaggio attraverso la raccolta:

ChildView = Backbone.Marionette.ItemView.extend({ 
    send_message: function(){ 
      this.model.collection.trigger('some-message'); 
    } 
}) 

ParentCollectionView = Backbone.Marionette.CollectionView.extend({ 
    // ON RENDER 
    onRender: function(){ 
      this.listenTo(this.collection, 'some-message', this.do_something); 
    } 
    // DO SOMETHING 
    do_something: function(){ 
      alert('did something'); 
    } 
}); 

credo che questo non è giusto perché:

  • sto inviando il messaggio dal punto di vista del bambino, attraverso i dati, indietro alla vista genitore
  • In questo caso, il messaggio non è relativo ai dati, è strettamente relativo al messaggio che passa tra le viste sui contenuti della vista
  • Il modello potrebbe appartengono a più di una collezione

Invece, vorrei inviare un messaggio direttamente da una vista figlia alla sua vista raccolta genitore. (In realtà, sto usando una vista composita, non sono sicuro se ciò che conta, volevo mantenere l'esempio semplice però).

risposta

4

o hanno la vista del bambino emette direttamente l'evento e hanno il genitore ascoltare per esso:

ChildView = Backbone.Marionette.ItemView.extend({ 
    send_message: function(){ 
      this.trigger('some-message'); 
    } 
}) 

ParentCollectionView = Backbone.Marionette.CollectionView.extend({ 
    // ON RENDER 
    onRender: function(){ 
      // no idea how Marionette references its children views 
      // let's say this.subview is a reference to your child view 
      this.listenTo(this.subview, 'some-message', this.do_something); 
    } 

    // DO SOMETHING 
    do_something: function(){ 
      alert('did something'); 
    } 
}); 

Oppure utilizzare un evento dedicato emettitore si inietta nella vostra visualizzazione secondaria (s)

ChildView = Backbone.Marionette.ItemView.extend({ 
    send_message: function(){ 
      this.channel.trigger('some-message'); 
    } 
}) 

ParentCollectionView = Backbone.Marionette.CollectionView.extend({ 
    initialize: function(){ 
      this.channel = _.extend({}, Backbone.Events); 
      this.listenTo(this.channel, 'some-message', this.do_something); 
    }, 
    // ON RENDER 
    onRender: function(){ 
      // pass the channel to the child 
      // that probably should be done when the child is created 
      this.subview.channel = this.channel; 
    }, 
    // DO SOMETHING 
    do_something: function(){ 
      alert('did something'); 
    } 
}); 
1

Marionette ha una pratica funzione chiamata triggerMethod che può inviare eventi dal figlio al genitore.

this.triggerMethod("someMethod", data1...) 

Quell'evento e 'colto dalla casa madre utilizzando un ascoltatore onChildview

onChildviewSomeMethod(childView, data1param, ...) {}