0

我正在 Google 闭包中开发一个网络应用程序,其结构如下所示:

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

实际的组件结构要复杂得多。重要的一点是,整个组件树中有许多不同的组件可以启动某些操作。在此示例中,按 enter in Search Box、按Search Button或按Next Pageall 需要进行查询。

这很容易处理。组件树中任何地方的任何孩子都可以做

this.dispatchEvent(App.EventType.ACTION, ...)

App当事件向上传播时将能够收听它。问题是另一个方向:当App从它的查询中接收到数据时,它必须将它推送给所有的孩子。

App尝试直接推送到Search boxand似乎很脆弱Results,因为它们在组件树中的位置可能会发生变化。我想做的是触发一个App.EventType.DATA_RECEIVED事件并让所有孩子(和子孩子等)听到它。

我能找到的在谷歌关闭中做到这一点的唯一方法是创建一个全局公共单例实例App并用作所有App.EventType.DATA_RECEIVED事件的源,或者App深入到所有子项和子项。

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

有没有一种简单的方法可以在关闭时分派向下冒泡的事件?

4

1 回答 1

0

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

没有好的方法可以在组件树中传递这些东西。甚至闭包本身也会遇到这个问题,将opt_domHelper树向下传递到每个子组件。

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

这本身不是一个好的解决方案,但它是所有可能的弊端中最小的一个。而且,如果您已经尽职尽责地opt_domHelper到处传递,那么问题也不会更糟:管道变得更具可扩展性,并且其opt_domHelper本身对实现者隐藏(他们现在environment改为四处传递)。

于 2013-01-31T18:46:04.470 回答