我正在使用谷歌关闭的网络应用程序,其结构是这样的:
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 box
和Results
似乎非常脆弱,因为它们在组件树中的位置可能会发生变化。我想做的是发起App.EventType.DATA_RECEIVED
事件并让所有孩子(以及子女等)听到它。
我在谷歌关闭中执行此操作的唯一方法是创建App
的全局公共单例实例,并将其用作所有App.EventType.DATA_RECEIVED
事件的来源,或者App
向所有儿童和子女儿发送信息。
这两者都以自己的方式凌乱而脆弱。
关闭时是否有一种简单的方法可以调度向下冒泡的事件?
答案 0 :(得分:0)
这不是一个非常令人满意的答案,但这是我所确定的:
没有什么好方法可以将 down 组件树传达给他们。即使是闭包本身也会遇到这个问题,将opt_domHelper
向下传递给每个子组件。
我的建议是为您的应用子类化goog.ui.Component
并创建一个myapp.Environment
类,其中包含opt_domHelper
和其他环境变量,例如指定为应用程序事件通道的一个事件侦听器
这本身并不是一个好的解决方案,但它是所有可能的邪恶中最不可能的。如果你已经尽职尽责地传递opt_domHelper
,那么问题就不会更糟了:管道变得更具可扩展性,而opt_domHelper
本身对于实现者来说是隐藏的(现在传递给environment
而不是)。