Javascript 关闭事件泡沫下降

Javascript 关闭事件泡沫下降,javascript,events,javascript-events,google-closure,google-closure-library,Javascript,Events,Javascript Events,Google Closure,Google Closure Library,我正在Google closure中开发一个web应用程序,其结构如下: App + Control Pane | + Search Box | + Search Button + Result Pane + Results + Next Page Link 实际的组件结构要复杂得多。重要的一点是,组件树中有许多不同的组件可以启动某些操作。在本例中,在搜索框中按enter键,按搜索按钮,或按下一页都需要进行查询 这很容易处理。组件树中任意位置的任何子级都

我正在Google closure中开发一个web应用程序,其结构如下:

App
  + Control Pane
  |  + Search Box
  |  + Search Button
  + Result Pane
     + Results
     + Next Page Link
实际的组件结构要复杂得多。重要的一点是,组件树中有许多不同的组件可以启动某些操作。在本例中,在
搜索框中按enter键
,按
搜索按钮
,或按
下一页
都需要进行查询

这很容易处理。组件树中任意位置的任何子级都可以执行此操作

this.dispatchEvent(App.EventType.ACTION, ...)
App
将能够在事件向上传播时收听它。问题是另一个方向:当
App
从其查询接收数据时,它必须将数据推送到所有子级

应用程序
试图直接推送到
搜索框
结果
,似乎非常脆弱,因为它们在组件树中的位置可能会发生变化。我想做的是启动一个
App.EventType.DATA\u接收到的
事件,让所有的孩子(和子孩子等)听到它

在google closure中,我找到的唯一方法是创建一个
App
的全局公共单例实例,并将其用作所有
App.EventType.DATA\u接收的
events的源,或者将
App
传递给所有儿童和子儿童

这两者都有各自的混乱和脆弱之处


是否有一种简单的方法可以在结束时发送向下冒泡的事件?

这不是一个非常令人满意的答案,但这是我确定的:

在组件树中没有很好的方式来传达这些信息。即使闭包本身也会遇到这个问题,将
opt_domHelper
向下传递到每个子组件

我的建议是为应用程序创建一个子类
goog.ui.Component
,并创建一个
myapp.Environment
类,该类包含
opt_domHelper
和其他环境变量,例如一个指定为应用程序事件通道的事件侦听器


这本身不是一个好的解决方案,但它是所有可能的弊病中最小的一个。如果您已经尽职尽责地到处传递
opt_-domHelper
,那么问题就不会更糟了:管道变得更具可扩展性,
opt_-domHelper
本身对实现者是隐藏的(他们现在传递
环境

这听起来更像是一个设计决策。我假设您想要使应用程序的其余部分可用的数据是模型的一部分,那么为什么不将各个组件连接起来,以侦听它们感兴趣的模型位,并在您获取数据的地方解析数据,并让模型分派更改事件。丙氨酸结合。