【发布时间】:2011-12-12 04:45:26
【问题描述】:
我有一个主视图,在该主视图中我有另一个视图,当我单击按钮时会创建该视图。有没有办法在父视图上侦听从子视图触发的事件的自定义事件。我尝试使用 jQuery 触发器通过 el 属性来实现,但效果不佳。
【问题讨论】:
-
一些示例代码会有所帮助。
标签: jquery backbone.js
我有一个主视图,在该主视图中我有另一个视图,当我单击按钮时会创建该视图。有没有办法在父视图上侦听从子视图触发的事件的自定义事件。我尝试使用 jQuery 触发器通过 el 属性来实现,但效果不佳。
【问题讨论】:
标签: jquery backbone.js
是的,没问题...您会想要使用“事件聚合器”模式。这是 Backbone 中的 1 行代码:
var eventAgg = _.extend({}, Backbone.Events);
现在,您可以在应用程序的任何位置触发/绑定来自该对象的事件,并让应用程序的不同部分以解耦的方式相互通信。
我经常使用这个!
我还在这里写了更多关于它的博客:http://lostechies.com/derickbailey/2011/07/19/references-routing-and-the-event-aggregator-coordinating-views-in-backbone-js/
【讨论】:
Backbone.View.prototype.eventAggregator = _.extend({}, Backbone.Events);。通过这样做,每个视图在每次构建时都会获得事件聚合器。
viewModel = new Backbone.Model() 不会更优雅吗?至少这样不同的视图可以绑定到视图模型中的更改,而不是任意事件。例如viewModel.bind('change:selectedFoo', aView.render) 与eventAgg.bind('selectedFooChanged', aView.render)。想法?
BaseView,它已经扩展了Backbone.View 以添加一些其他功能:eventAggregator: _.extend {}, Backbone.Events。我的所有观点都继承自 BaseView 和 Backbone.View,如果需要的话,可以安然无恙地用于其他用途。我原来的旧 BaseView 可以在这里看到:gist.github.com/1515914
这是另一种方法,对于正在寻找一种简单方法将事件从子视图“冒泡”到父视图的人来说可能更直观:
https://github.com/dgbeck/backbone.courier
自述文件中有一些关于它如何与事件聚合器进行比较的讨论。
【讨论】:
不需要滚动您自己的“事件聚合器”或中介或发布订阅(就像上面描述的那样简单),因为 Backbone 将 Events 对象直接混合到其命名空间中的 Backbone 对象。这是源代码及其实现文档的link。
允许 Backbone 对象充当全局事件总线,供希望将全局“pubsub”放在方便位置的人们使用。
【讨论】: