2014-12-05 4 views
0

Я использую магистральный js. Предположим, у меня есть дочерний вид с именем childView и родительский вид, называемый parentView.пожарное событие, записанное на детском образе в backbone.js

parentView = Backbone.View.extend({ 
    render: function() { 
    new childView().render(); 
    } 
}) 

childView = Backbone.View.extend({ 
    render: function() { 

    }, 
    events: { 
    'click .abc' : 'fireEvent' 
    } 
}) 

Мне нужно вызвать событие click, записанное в childView в parentView.

ответ

1

Самый простой способ - использовать экземпляр Backbone.View. Backbone.View смешивается с Backbone.Events, что дает вам возможность использовать его в качестве агрегатора событий.

Пример для случая:

childView = Backbone.View.extend({ 
    render: function() { 

    }, 
    events: { 
    'click .abc' : 'fireEvent' 
    }, 
    fireEvent: function (e) { 
     this.trigger('child:event:fired', e); 
    } 
}); 

И в родительском зрения:

parentView = Backbone.View.extend({ 
    render: function() { 
    this.childView = new childView(); 
    this.childView.on('child:event:fired', this.onChildEvent, this); 
    childView .render(); 
    }, 
    onChildEvent: function (e) { 
     console.log("child view event"); 
    }, 
    closeThisView: function() { 
    this.childView.off('child:event:fired', this.onChildEvent, this); 
    } 
}) 

Таким образом, вы можете подписаться на события childView, но вам нужно вручную управлять развязывание от всех подписок.


Другое решение по той же проблеме можно найти, объявив глобальный агрегатор событий для обоих представлений.

var vent = _.extend({}, Backbone.Events); 

И в ваших взглядах просто вызвать необходимые события с vent.trigger и подписаться/отписаться с vent.(on/off) методами.