2016-01-23 3 views
5

Что такое хороший способ отправки сообщения из представления Child в его родительский вид коллекции в Backbone.js или Marionettejs?Что такое хороший метод отправки сообщения из дочернего представления в его родительский вид коллекции в Backbone.js или Marionette.js?

Обычно я отправить сообщение через коллекцию:

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

Я думаю, что это не так, потому что:

  • Я посылающего сообщение с точки зрения ребенка, через данные, обратно к родительскому представлению
  • В этом случае сообщение не относится к данным, его строгое сообщение, проходящее между представлениями о материале представления
  • Модель может принадлежат более чем одной коллекции

Вместо этого я хотел бы отправить сообщение непосредственно из дочернего представления в его родительский вид коллекции. (на самом деле, я использую составной вид, не уверенный, если это имеет значение, хотелось бы, чтобы пример был простым).

ответ

4

Либо иметь вид ребенка непосредственно испускает событие и есть родитель слушать для него:

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

Или использовать выделенное событие эмиттер Вы вводите в свой подвид (ы)

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

марионетки имеет удобную функцию, называемую triggerMethod, которая может отправлять события от дочернего элемента к родительскому.

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

Это событие перехватывается родителю с помощью onChildview слушателя

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