【发布时间】:2012-03-19 16:22:09
【问题描述】:
我有一个名为 shopView 的自定义组件,它是一个 MXML 可换肤组件。我有一个名为 ShopController 的控制器类,它负责在弹出窗口中显示此组件、更新组件中显示的信息等。
现在,我想在从控制器创建 ShopView 之后创建 ShopView(creationComplete() 事件)之后操作该 ShopView 的一些子组件
所以,我附加了一个事件监听器,实习生会做一些初始化过程
creationComplete="init(event)"
init() 函数
private function init(event:FlexEvent):void{
event.stopImmediatePropagation();
initMenus();
initSlots();
dispatchEvent(event);
}
从控制器类附加另一个创建完成事件
_shop.addEventListener(FlexEvent.CREATION_COMPLETE,onShopCreated);
*_shop 是 ShopView* 的实例
现在,如果您看到 init() 函数,我将在此处停止事件传播,执行一些初始化过程,然后调度事件(让商店控制器完成其余工作)
现在,这导致应用程序崩溃,因为 ShopView 的 crationComplete 事件被递归调用。我在想 dispatchEvent 会传播到其他侦听器,但似乎它正在传播回同一个组件。
我已通过从 init() 函数中删除 e.stopImmediatePropagation() 和 dispatchEvent(event) 行来修复它。但我想知道为什么会这样?
这是 mxml/flex 组件的已知问题吗?或者这是预期的行为?
更新:正如我在下面所说的那样,我在 . 中的做法不同。得到答案,基本上是我的愚蠢:)
因为我在编写 .as 类时没有看到这种行为 停止事件传播并根据业务逻辑调度事件。
提前致谢。
【问题讨论】:
-
您基本上已经通过这样做创建了一个循环,它将继续尝试初始化您的应用程序。我同意 takteek 的观点,您不需要停止然后重新发送创建完成。您的组件应该在您点击 init() 时添加到视图堆栈中,因此在其上设置属性应该可以正常工作。
-
基本上在您删除上述代码之前,您会从侦听该事件的同一个组件以及刚刚被同一事件触发的同一个函数分派相同的事件。因此是无限循环。
标签: actionscript-3 apache-flex flex4