backbone.js:无法从父视图触发自定义视图并将子视图绑定到它

backbone.js:无法从父视图触发自定义视图并将子视图绑定到它,backbone.js,backbone-events,Backbone.js,Backbone Events,我有一个父主干视图,它在其渲染方法中创建一个新的主干视图 var appView = Backbone.View.extend({ ... render: function() { preview = new previewDataView({model: model, el: $el.find('.preview-container')}); } }); 我希望能够在appView中触发一个自定义事件,并将previewDataView绑定到它——这可

我有一个父主干视图,它在其渲染方法中创建一个新的主干视图

var appView = Backbone.View.extend({
    ...
    render: function() {
        preview = new previewDataView({model: model, el: $el.find('.preview-container')});
    }
});

我希望能够在
appView
中触发一个自定义事件,并将
previewDataView
绑定到它——这可能吗<代码>预览数据视图在我尝试此操作时未收到事件。想法?

我认为有两种方法可以做到这一点。首先,将父视图传递到子视图中。其次,创建一个处理事件触发的eventAggregator

第一:

您可以将appView作为选项传递到previewDataView中

preview = new previewDataView({ // your options, 'parent':this });
在previewDataView中,您将绑定到父自定义事件,如下所示:

this.parent = this.options.parent;
this.parent.bind('eventName', this.onEvent, this);
第二:(刚学会这个技巧)

您可以创建一个eventAggregator,帮助您的视图订阅和取消订阅彼此需要的事件。下面是一个很好的答案,在堆栈上详细解释了这一点:

在评论中,@Brian Genisio更进一步地将其包含在代码中:

Backbone.View.prototype.eventAggregator = _.extend({}, Backbone.Events);
在代码开始时运行此命令,每个视图都可以访问eventAggregator,它将是需要跨视图触发和接收的事件的中心集线器。您可以这样使用它:

// Parent View
this.eventAggregator.trigger('someEvent');

// Child View
this.eventAggregator.bind('someEvent', this.function, this);

这样,您就不必显式地在需要相互访问以进行事件触发和侦听的视图之间传递引用。这种方法对我来说非常方便。:-)

对我来说也是哈哈,很好的解释。。在您的backbone.js项目变得更加复杂,视图和转换变得更加复杂之后,这些东西确实有助于找到一种处理类似事件的模式方法。您将如何在listenTo()中使用它
this.listenTo(eventAggregator'someEvent',this.function)?