如何在Controller中捕获Subview事件?

时间:2017-06-30 07:15:27

标签: javascript backbone.js requirejs backbone-events

使用RequireJS模块构建的BackboneJS应用程序。

View 有多个 subView 实例。 subView 中的点击事件应该运行 Controller 方法。

初始化顺序需要 Controller 中的 View 模块,因此 subView 中需要 Controller 模块会创建循环依赖项

我更愿意创建事件来向Controller传达数据。考虑了两个选择:

  1. View会侦听subView事件并触发自己的事件 控制器;
  2. 拥有第三个app-global对象,subViews触发器 对象上的事件,Controller会监听该对象吗?
  3. 这里最好的模式是什么?

2 个答案:

答案 0 :(得分:1)

如果只有一种情况,则选项1是正确的 但是,如果是一个常见的操作,有多个事件和许多视图的需要:2选项可能更好。

答案 1 :(得分:1)

Marionette已event bubbling到位。例如,如果视图触发“some:event”,您可以在集合视图上将其作为“childview:some:event”进行监听。

如果你有非常深的视图结构,那么“childview:... childview:some:event”开始看起来很糟糕然后你可能会考虑三个选项:手动冒泡它们,使用像“backbone.radio”这样的全局消息总线“或者传递一些实体在其上发射事件。

我个人对全球总线感到不满,并希望为应用程序的每个有意义的部分提供一些能够实现mediator / observer模式的东西。基本实现可能是状态模型,在控制器(或路由器)中创建并传递到下面的所有视图中 - 然后它们中的任何一个都可以更改状态或听取更改。

实际上由于控制器在Marionette 3中被弃用,所以将所有控制器逻辑移到这些状态模型中可能是个好主意。不幸的是,由于Backbone社区正在衰落,我找不到任何有关该主题的好资源。