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

mat*_*aso 5 javascript design-patterns event-driven-design eventaggregator backbone.js

当你有一个引用另一个视图并监听其事件的视图时,事件处理程序很好,这对于解耦和可重用性是完美的.

问题虽然有时我有没有被引用的视图所以我使用Event Aggregator这是一个全局通知来知道是否发生了什么......但是当我只是想听孩子们无法参考的视图时,这似乎不对DOM层次结构中的冒泡事件.

但是让我说我​​有一个视图层次结构,如:

  • ParentView
    • ChildView
      • ChildView
        • ModalView

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

Dan*_*nor 2

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

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

Backbone.courier 使用 DOM 来检测父视图,但您可以实现自己的父视图检测方法。

因此,无需事件聚合或 DOM,它也是可行的,但我认为您最终将创建和管理自己的层次结构。因为我们已经有了 DOM,所以这个味道。这肯定会让我产生疑问:“我真的需要冒泡这个事件吗?”。

对于您的示例,最简单的解决方案可能是为您的ModalView提供对ParentView 的引用,并在您的事件在ModalViewparentView.listener()上触发时简单地调用。你真的需要它来让孩子们度过难关吗?这真的需要解耦吗?当您认为自己没有参考其他观点时,可能是您的限制过于严格。

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

modalView.container = parentView;

modalView.myEventHandler = function(e) {
    this.container.myEventHandler(e);
}
Run Code Online (Sandbox Code Playgroud)