【问题标题】:Communicating between views design patterns with events使用事件在视图设计模式之间进行通信
【发布时间】:2013-02-17 02:49:17
【问题描述】:

当您的视图引用另一个视图并侦听其事件时,事件处理程序很好,这非常适合解耦和可重用性。

虽然问题是有时我有未引用的视图,所以我使用事件聚合器,它是一个全局通知来了解是否发生了某些事情......但是当我只想听我无法引用的儿童视图时,这似乎不正确,类似于 DOM 层次结构中的冒泡事件。

但是让我说我​​有一个像这样的视图层次结构:

  • 父视图
    • 子视图
      • 子视图
        • 模态视图

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    对于您的示例,最简单的解决方案可能是为您的 ModalView 提供对 ParentView 的引用,并在您的偶数被触发时简单地调用 parentView.listener() 模态视图。你真的需要它在孩子们中间冒泡吗?这真的需要解耦吗?当您假设您没有参考您的其他观点时,可能是您过于严格了。

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

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

    【讨论】:

    • 谢谢你,我认为你是对的。在我的情况下,最好的解决方案可能是提供一个 ModalView 并引用调用者/演示者,这是有意义的......当 ModalView 完成并触发演示者时被称为最深的 ChildView 并且它冒泡触发通知 ParentView
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多