【问题标题】:flex 4 - why dispatchEvent triggering creationComplete recursivelyflex 4 - 为什么 dispatchEvent 会递归触发 creationComplete
【发布时间】: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


【解决方案1】:

这是预期的行为。

当您重新分派现有事件时,dispatchEvent 会自动克隆它(因为您不能两次分派同一事件。)这会清除所有与传播相关的标志。

请问您为什么要在这种情况下重新调度 CREATION_COMPLETE?如果没有您删除的两行,两个处理程序都可以正常工作。

【讨论】:

  • 我这样做是因为,当前代码没有意义,因为它的工作方式完全相同,无需停止并重新调度事件。但我添加它是因为,将来我将编写一个代码,从我的业务角度来看,创建完成没有完成,因为它调用了异步函数,我需要在收到响应后调度创建完成。
  • 您需要做的只是在 preInitialize 期间运行您的代码,并在完成后触发您自己的事件并从中运行您的代码。 creationComplete 具有特定含义,劫持它是一个坏主意。
猜你喜欢
  • 1970-01-01
  • 2012-08-02
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
相关资源
最近更新 更多