我有一个名为 shopView 的自定义组件,它是一个 MXML 可换肤组件。我有一个名为 ShopController 的 Controller 类,它负责在弹出窗口中显示此组件,更新组件中显示的信息等。
现在,我想在从 Controller 创建 ShopView 后创建 ShopView(creationComplete() 事件)后操作该 ShopView 的一些子组件
所以,我附加了一个事件监听器,实习生执行一些初始化过程
creationComplete="init(event)"
init()函数
private function init(event:FlexEvent):void{
event.stopImmediatePropagation();
initMenus();
initSlots();
dispatchEvent(event);
}
附加了 Controller 类中的另一个创建完成事件
_shop.addEventListener(FlexEvent.CREATION_COMPLETE,onShopCreated);
*_shop 是 ShopView 的实例*
现在,如果您看到 init() 函数,我将停止事件传播,执行一些初始化过程,然后分派(dispatch)事件(让商店 Controller 完成其余的工作)
现在,这会使应用程序崩溃,因为 ShopView 的 crationComplete 事件被递归调用。我原以为dispatchEvent会传播到其他监听器,但看起来它正在传播回同一个组件。
我通过从 init() 函数中删除 e.stopImmediatePropagation() 和dispatchEvent(event) 行来修复它。但我想知道为什么会这样?
这是 mxml/flex 组件的已知问题吗?或者这是预期的行为?
更新:我没有在 .as 中做同样的事情,正如我下面所说的。得到答案,基本上是我的愚蠢:)
because I have not seen this behavior when I write .as classes where I stopevent propagation and dispatch the event based on business logic.
提前致谢。
最佳答案
这是预期的行为。
当您重新分派(dispatch)现有事件时,dispatchEvent
会自动克隆它(因为您无法分派(dispatch)同一事件两次。)这会清除所有与传播相关的标志。
请问为什么在这种情况下你要重新调度 CREATION_COMPLETE ?如果没有删除这两行,两个处理程序都可以正常运行。
关于actionscript-3 - flex 4 - 为什么dispatchEvent递归地触发creationComplete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9511710/