2015-08-31 2 views
0

Итак, у меня есть layoutView, можно назвать его MyLayoutView. В этом макете я два childViews:Как childView правильно прослушивает другие события childView с помощью marionettejs?

return Marionette.LayoutView.extend({ 
    template: templates.pages.layoutTpl, 
    regions: { 
     regionTest1: "#test1-view", 
     regionTest2: "#test2-view" 
    }, 
    childEvents: { 
     'my:event': function (childView, param) { 
      console.log(param); //its ok 
     }}) 

и в childView (CompositeView), я вызвать событие, например:

this.triggerMethod('my:event', [1,2,3]); 

работает отлично. Как я могу прослушивать это событие из другого дочернего элемента?

До сих пор я это сделать в LayoutView:

'my:event': function (childView, params) { 
      this.getRegion('regionTest2').currentView.trigger('my:event2'); 
     }, 

и regionTest2 Я слушаю события:

//in the secord childView 
this.on('my:event2', function() {//do whatever...}) 

поймать событие в другой childView. ОК, это работает, но я думаю, что письмо немного уродливое .. любые предложения к нему лучше?

ответ

0

В основном вы находитесь на правильном пути, если хотите использовать макет вашего родительского представления, чтобы оповещать события между дочерними видами (вы также можете использовать instead of triggers).

Однако причина, по которой это кажется уродливым, объясняется использованием родительского макета как посредника для соединения его, казалось бы, непересекающихся детских представлений. Существует множество подходов и способов обмена сообщениями и событий, чтобы решить эту проблему, а также несколько плагинов, таких как Backbone.Radio (марионетка планируется заменить wreqr на радио как зависимость). Если это возможно, я бы предложил использовать каналы канала Backbone Radio для лучшего пространства имен и управления вашими событиями (например, создание и управление каналами в зависимости от их назначения), а также помочь разделить ваши взгляды.

+0

Привет, Akshad, спасибо за ваш ответ, я скоро попробую Backbone.Radio плагин. – d00d