当一个组件调度一个事件时,事件流程有三个阶段,capture - 事件从应用程序流向调度事件的组件,当事件在Target实际调度事件时定位,然后是事件从目标流向应用程序的冒泡阶段。在某种情况下,Application有子comp1,comp1有子comp2。我在comp1中有一个按钮来调度事件,我想在comp2中监听那个事件。理想情况下,事件将从Application-> comp1-> button-> comp1-> Application流出。我怎样才能实现我的目标?
答案 0 :(得分:1)
在comp1
内部发送你的活动并确保它起泡:
myButton.addEventListener(MouseEvent.CLICK, handleMyButtonClick);
private function handleMyButtonClick(event:MouseEvent):void {
dispatchEvent(new Event("myCustomEvent", true));
}
现在comp2
内部stage
:
stage.addEventListener("myCustomEvent", handleMyCustomEvent);
就是这样:因为事件起泡,所以总是在某个时刻点击stage
。所以你可以用它来随时随地收听。在尝试附加监听器之前,请不要忘记确保stage
的{{1}}属性已设置。
注意:请注意,应用程序中的所有组件都能够查看此事件,因此请确保正确的组件处理正确的事件。对于初学者,我绝不会将此方法用于内置事件;仅使用comp2
与内置事件不一致的自定义事件。
答案 1 :(得分:0)
你所建议的可能不是最好的方法。你应该通过让父母明确地做一些有助于孩子知道该做什么的事情来更好地处理这个问题。
实现此目的的一种方法是使用事件总线的概念,例如what you see in RobotLegs。只需给你的child2一个名为eventBus
的公共字段或属性,其类型为IEventDispatcher。然后,您可以让父级使用this
填充此属性。我通常将这些属性设置为getter / setter,这样当孩子从舞台上移开并且孩子可以remove its listeners时,该属性可以被隐藏。
这使您可以准确地开始实现这一目标所需的内容,但是如果您发现自己在需要它的情况下使用child2来听取其他对象,那么您就可以开始了。
第二种可能性就是在子节点上公开一个父可以调用的子方法(父节点已经有了对子节点的引用 - 这里没有引入不必要的耦合),只需调用它而不是调用它事件