2011-10-20 118 views
22

我有一个主视图,并在该主视图中有另一个视图,当我单击按钮时会创建该视图。有没有办法在父视图上侦听从子视图触发的事件的自定义事件。我试图通过使用jQuery触发器的el属性来做到这一点,但这并不奏效。在骨干中从一个视图触发事件到另一个视图

+1

一个小例子代码会有所帮助。 – erturne

回答

43

雅,没问题......你会想要使用“事件聚合器”模式。这是在骨干网1行代码:

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

现在你可以触发/绑定事件从此对象,无处不在您的应用程序,并让您的应用程序的不同部分相互处于分离的方式沟通。

我用这个很好!

我也博客更多关于它在这里:http://lostechies.com/derickbailey/2011/07/19/references-routing-and-the-event-aggregator-coordinating-views-in-backbone-js/

+14

+1。我更进一步,将事件聚合器注入到每个视图中:'Backbone.View.prototype.eventAggregator = _.extend({},Backbone.Events);'。通过这样做,每个视图在每次构建时都会获取事件聚合器。 –

+3

是不是你的事件聚合器只是一个简化的“视图状态模型”? 'viewModel = new Backbone.Model()'不会更优雅吗?至少,不同视图可以绑定到视图模型中的*更改*,而不是任意事件。例如'viewModel.bind('change:selectedFoo',aView.render)'vs'eventAgg.bind('selectedFooChanged',aView.render)''。思考? –

+2

@新月新鲜 - 没有。一个模型具有语义含义,是一些实体的有状态表示。它具有操纵这些属性的属性和方法。事件聚合器是一种无状态的对象,它只通过使用事件来协调系统的某些部分,从而允许更加分离的体系结构。 http://martinfowler.com/eaaDev/EventAggregator.html –

2

这里是另一种方法,那可能是谁正在寻找一种简单的方法,人们更直观的“泡沫”事件了从子视图到父视图:

https://github.com/dgbeck/backbone.courier

有关于如何比较事件聚合自述一些讨论。

0

因为Backbone将Events对象直接混合到其名称空间中的Backbone对象,所以不需要滚动您自己的“事件聚合器”或mediator或pubsub(如上所述)。这里有一个link的源代码及其实现文档。

允许Backbone对象作为全局事件总线,用于希望在一个方便的地方使用全局“pubsub”的人们。

相关问题