0

当一个事件被组件分派时,事件的流动分为三个阶段,捕获 - 事件从应用程序流向分派事件的组件,当事件到达实际分派事件的目标时,目标,然后事件从目标流向应用程序的冒泡阶段。有一种情况,Application 有子 comp1,comp1 有子 comp2。我在 comp1 中有一个按钮,用于调度事件,我想在 comp2 中收听该事件。理想情况下,事件将从 Application->comp1->button->comp1->Application 流出。我怎样才能实现我的目标?

4

2 回答 2

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属性。comp2

注意:请注意,应用程序中的所有组件都可以看到此事件,因此请确保正确的组件处理正确的事件。对于初学者,我永远不会在内置事件中使用这种方法;仅使用types 与内置事件不一致的自定义事件。

于 2012-10-16T14:31:47.477 回答
0

你的建议可能不是最好的方法。您可能应该通过让父母明确地做一些帮助孩子知道该做什么的事情来更好地处理这个问题。

一种方法是使用事件总线的概念,例如您在 RobotLegs 中看到的eventBus只需给您的 child2 一个使用 IEventDispatcher 类型调用的公共字段或属性。然后,您可以让父级使用 填充此属性this。我通常将此类属性设置为 getter/setter,以便在将孩子从舞台上移除并且孩子可以移除其 listeners时,该属性可以为空。

这使您可以从实现这一目标所需的确切内容开始,但是如果您发现自己在需要它来收听不同对象的情况下使用 child2,那么您就可以开始了。

第二种可能性是只在子级上公开一个父级可以调用的方法(父级已经有对子级的引用——你没有在这里引入不必要的耦合),然后简单地调用它而不是调度事件。

于 2012-10-16T15:41:59.680 回答