【问题标题】:Flex 4.6 check if creationComplete has occuredFlex 4.6 检查是否创建完成
【发布时间】:2012-07-19 18:07:00
【问题描述】:

在 AS3 中,我知道我可以通过在加载的 SWF 的开头包含这个来检查舞台是否可以被外部加载的 SWF 访问:

if (stage) {
  this.init();
} else {
  addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
}

上述解决方案非常适合在执行这些行时检查程序是否可以访问该阶段,或者添加一个事件侦听器来侦听该阶段何时可以访问。

我正在尝试在 Flex 4.6 的自定义组件中复制类似的情况。但是,我不是在监听舞台的存在,而是在寻找组件的creationComplete 事件是否已被触发。

对于creationComplete事件是否被触发,是否有类似的解决方案,如果没有触发则监听?

【问题讨论】:

标签: actionscript-3 flash apache-flex events flex4


【解决方案1】:

我只是 Windows grepped 4.6 源和 UIComponent 在初始化设置为 true 时调度创建完成事件,因此 http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/core/UIComponent.html#initialized 应该可以工作。

编辑 为响应注释,调用了 initialize,但在第 9 步没有将 set initialized 设置为 true,这实际上是在 UIComponent 中调度 CREATION_COMPLETE 的位置,请参阅我从 UIComponent 的 4.6 源中提取的这个 sn-p:

   

/**
     *  A flag that determines if an object has been through all three phases
     *  of layout: commitment, measurement, and layout (provided that any were required).
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */

/**
 *  @private
 */

public function set initialized(value:Boolean):void
{
    _initialized = value;

    if (value)
    {
        setVisible(_visible, true);
        dispatchEvent(new FlexEvent(FlexEvent.CREATION_COMPLETE));
    }
}

如果你不相信我在 UIComponent 中按 Ctrl+Shift+T 并搜索“Variables: Creation”,你会得到一个注释块,该块开始分派启动事件的部分和一些变量标记这些事件已完成。 INITIALIZE 事件发生在我引用的下面的另一个 setter 中。

public function set processedDescriptors(value:Boolean):void
{
    _processedDescriptors = value;

    if (value)
        dispatchEvent(new FlexEvent(FlexEvent.INITIALIZE));
}

【讨论】:

  • 感谢您的输入,但您使用的引用是 Flex 3 的一部分。Flex 4.6 component lifecycle 显示初始化发生在第 9 步,但 creationComplete 直到第 14.b 步才调度.话虽如此,我很确定initialized 不会完全适合我的场景。不过,谢谢!
  • 感谢您回来查看,如果由于任何原因导致这有问题,请告诉我,因为我过去也不得不自己这样做,并且总是觉得应该提供一些东西来了解如果这些事件已经被触发,这对我来说也是有用的信息。
【解决方案2】:

为什么不在你的组件中添加一个 creationComplete 事件监听器并在处理函数中执行逻辑呢?此外,您可以尝试创建一个布尔属性,例如

public var isInitialized:Boolean = false;

function creationCompleteHandler(e:Event):void
{
   isInitialized = true;
   //code here
}

这样您可以从外部来源检查它是否已初始化。

【讨论】:

  • 我知道我可以做到,但它似乎总是解决问题的“简单”方法。我只是想知道 Flex 是否提供了另一种方法来检查这些条件。感谢您的意见。
  • 好吧,我想不出其他任何事情了。不过,了解“简单”的方法总是一件好事 :)
【解决方案3】:

为什么不直接使用 applicationComplete 而不是 creationComplete,因为在检查阶段是否可访问时,applicationComplete 是循环中的最后一个阶段?我想每个应用程序组件的creationComplete 都必须在applicationComplete 之前触发。出于某种原因,您是否尝试在应用程序准备好之前访问 creationComplete?

我刚刚回顾了一下,我完全不确定您为什么要积极寻求更困难的解决方案。这个解决方案应该有效,我个人觉得它是正确的。当然,您可以检查 creationComplete 是否已触发,但除非您明确需要此功能,否则当您当然可以通过利用生命周期利用良好的逻辑分离时,我看不到检查 creationComplete 的意义......

【讨论】:

    猜你喜欢
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多