视图之间的通信设计模式与事件

时间:2013-03-02 17:39:22

标签: javascript design-patterns backbone.js eventaggregator event-driven-design

当你有一个引用另一个视图并监听其事件的视图时,

事件处理程序很好,这非常适合解耦和重用。

问题虽然有时候我有没有被引用的视图所以我使用Event Aggregator这是一个全局通知来知道是否发生了什么......但是当我只是想听儿童观点时我似乎无法参考就像在DOM层次结构中冒泡事件一样。

但是我要说我的视图层次结构如下:

  • ParentView
    • ChildView
      • ChildView
        • ModalView

ModalView 触发事件时,我想在 ParentView 中知道...我无法使用事件冒泡,因为 ModalView 不是在相同的DOM层次结构中,我应该在这种情况下使用Event Agregator还是其他什么?我真的希望事件泡沫适合我的情况。

1 个答案:

答案 0 :(得分:2)

如果你不能使用DOM的层次结构并且你不想使用事件聚合器,那么我的第一直觉是你需要在你的视图中构建自己的层次结构。

您可以查看backbone.courier,了解如何实现自己的事件冒泡系统。

Backbone.courier uses the DOM to detect parent views但你可以实现自己的父检测方法。

所以没有事件聚合或DOM,它是可行的,但我认为你最终会创建和管理自己的层次结构。 由于我们已经拥有了DOM,这就闻起来了。这肯定会让我质疑:“我真的需要冒泡这个事件吗?”。

对于您的示例,最简单的解决方案可能是为 ModalView 提供对 ParentView 的引用,并在触发偶数时简单地调用parentView.listener() ModalView 即可。你真的需要泡泡孩子吗?这真的需要解耦吗?当您认为自己没有引用其他视图时,可能是因为限制太多。

无论如何,这些都是我问自己的问题。虽然看起来很明显可能是最好的解决方案:

modalView.container = parentView;

modalView.myEventHandler = function(e) {
    this.container.myEventHandler(e);
}