关闭事件泡沫破灭

时间:2013-01-09 22:10:03

标签: javascript events javascript-events google-closure google-closure-library

我正在使用谷歌关闭的网络应用程序,其结构是这样的:

App
  + Control Pane
  |  + Search Box
  |  + Search Button
  + Result Pane
     + Results
     + Next Page Link

实际的组件结构要复杂得多。重要的是,组件树上有许多不同的组件可以启动某些操作。在此示例中,按下Search Box,按Search Button或点击Next Page都需要进行查询。

这很容易处理。组件树中任何位置的任何子项都可以

this.dispatchEvent(App.EventType.ACTION, ...)
当事件向上传播时,

App将能够收听它。问题是另一个方向:当App从其查询中接收数据时,它必须将其推送给所有子项。

App试图直接推送到Search boxResults似乎非常脆弱,因为它们在组件树中的位置可能会发生变化。我想做的是发起App.EventType.DATA_RECEIVED事件并让所有孩子(以及子女等)听到它。

我在谷歌关闭中执行此操作的唯一方法是创建App的全局公共单例实例,并将其用作所有App.EventType.DATA_RECEIVED事件的来源,或者App向所有儿童和子女儿发送信息。

这两者都以自己的方式凌乱而脆弱。

关闭时是否有一种简单的方法可以调度向下冒泡的事件?

1 个答案:

答案 0 :(得分:0)

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

没有什么好方法可以将 down 组件树传达给他们。即使是闭包本身也会遇到这个问题,将opt_domHelper向下传递给每个子组件。

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

这本身并不是一个好的解决方案,但它是所有可能的邪恶中最不可能的。如果你已经尽职尽责地传递opt_domHelper,那么问题就不会更糟了:管道变得更具可扩展性,而opt_domHelper本身对于实现者来说是隐藏的(现在传递给environment而不是)。