从Child视图向Backbone.js或Marionette.js中的父Collection视图发送消息的好方法是什么?

Chr*_*row 5 backbone.js marionette

什么是从儿童期在Backbone.js的或Marionettejs其父Collection视图发送消息的好方法吗?

通常我通过集合发送消息:

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');
     }
});
Run Code Online (Sandbox Code Playgroud)

我认为这不对,因为:

  • 我将子视图中的消息通过数据发送回父视图
  • 在这种情况下,消息与数据无关,它在视图之间的视图之间传递严格的消息
  • 该模型可以属于多个集合

相反,我想直接从子视图向其父集合视图发送消息.(实际上,我正在使用复合视图,不确定是否重要,但希望保持示例简单).

nik*_*shr 5

要么让子视图直接发出事件并让父视图监听它:

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');
     }
});
Run Code Online (Sandbox Code Playgroud)

或者使用您注入子视图的专用事件发射器

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');
     }
});
Run Code Online (Sandbox Code Playgroud)