2016-01-23 53 views
5

Jaka jest dobra metoda wysyłania wiadomości z widoku Dziecko do jej nadrzędnego widoku kolekcji w Backbone.js lub Marionettejs?Jaka jest dobra metoda wysyłania wiadomości z widoku podrzędnego do nadrzędnego widoku kolekcji w Backbone.js lub Marionette.js?

Normalnie wysłać wiadomość za pośrednictwem kolekcji:

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

myślę, że to nie jest w porządku, ponieważ:

  • wyślę wiadomość z punktu widzenia dziecka, na podstawie danych, z powrotem do widoku nadrzędnego
  • W tym przypadku komunikat nie odnosi się do danych, a jego komunikat jest przekazywany między widokami dotyczącymi widoku rzeczy.
  • Model może należy do więcej niż jednej kolekcji:

Zamiast tego chciałbym wysłać wiadomość bezpośrednio z widoku podrzędnego do jej widoku kolekcji nadrzędnej. (w rzeczywistości używam widoku złożonego, nie jestem pewien, czy to ma znaczenie, ale chciałbym, aby przykład był prosty).

Odpowiedz

4

Albo mieć wgląd dziecko bezpośrednio emitują zdarzenia i mają rodzic słuchać na nim:

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

Albo użyć dedykowanej wydarzeniu emiter wstrzyknąć do swojego podrzędny (ów)

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 ma przydatną funkcję o nazwie triggerMethod, która może wysyłać zdarzenia od dziecka do rodzica.

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

To zdarzenie jest złapany przez rodzica przy użyciu onChildview słuchacza

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