【问题标题】:fire an event from one view to another in backbone在主干中从一个视图触发事件到另一个视图
【发布时间】:2011-12-12 04:45:26
【问题描述】:

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

【问题讨论】:

  • 一些示例代码会有所帮助。

标签: jquery backbone.js


【解决方案1】:

是的,没问题...您会想要使用“事件聚合器”模式。这是 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/

【讨论】:

  • +1。我更进一步,将事件聚合器注入到每个视图中:Backbone.View.prototype.eventAggregator = _.extend({}, Backbone.Events);。通过这样做,每个视图在每次构建时都会获得事件聚合器。
  • 您的事件聚合器不只是一个简化的“视图状态模型”吗? viewModel = new Backbone.Model() 不会更优雅吗?至少这样不同的视图可以绑定到视图模型中的更改,而不是任意事件。例如viewModel.bind('change:selectedFoo', aView.render)eventAgg.bind('selectedFooChanged', aView.render)。想法?
  • @crescent fresh - 没有。模型具有语义意义,是某个实体的状态表示。它具有操作这些属性的属性和方法。事件聚合器是一个无状态对象,它仅通过使用事件来协调系统的某些部分,从而实现更加解耦的架构。 martinfowler.com/eaaDev/EventAggregator.html
  • 我将它添加到我的BaseView,它已经扩展了Backbone.View 以添加一些其他功能:eventAggregator: _.extend {}, Backbone.Events。我的所有观点都继承自 BaseViewBackbone.View,如果需要的话,可以安然无恙地用于其他用途。我原来的旧 BaseView 可以在这里看到:gist.github.com/1515914
  • @Allan:实际上是的。在生产应用程序中,我们使用这种“全局”视图状态模型(我不是指全局变量)来跟踪应用程序的当前状态。诸如当前选择的 foo、当前地图中心(地理坐标)、所有 foo 的完整列表等等等。这是视图放置视图“状态”的地方。而且我们免费获得事件聚合;)随着视图状态的变化,其他不同的视图可以相应地调整自己,而不知道谁或为什么状态发生了变化。
【解决方案2】:

这是另一种方法,对于正在寻找一种简单方法将事件从子视图“冒泡”到父视图的人来说可能更直观:

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

自述文件中有一些关于它如何与事件聚合器进行比较的讨论。

【讨论】:

    【解决方案3】:

    不需要滚动您自己的“事件聚合器”或中介或发布订阅(就像上面描述的那样简单),因为 Backbone 将 Events 对象直接混合到其命名空间中的 Backbone 对象。这是源代码及其实现文档的link

    允许 Backbone 对象充当全局事件总线,供希望将全局“pubsub”放在方便位置的人们使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多