3

在 AS3 中,我知道我可以通过在加载的 SWF 的开头包含以下内容来检查舞台是否可以访问,例如,外部加载的 SWF:

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

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

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

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

4

3 回答 3

3

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

编辑 响应调用初始化注释,但在步骤 9 中不会发生将初始化设置为 true 的情况,它实际上是在 UIComponent 中调度 CREATION_COMPLETE 的位置,请参阅我从 UIComponent 的 4.6 源中提取的这段代码:

   

/**
     *  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 并搜索“变量:创建”,您将获得一个注释块,该块开始分派启动事件的部分以及一些用于标记这些事件的变量已完成。INITIALIZE 事件发生在我引用的下面的不同设置器中。

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

    if (value)
        dispatchEvent(new FlexEvent(FlexEvent.INITIALIZE));
}
于 2012-07-20T04:05:29.547 回答
1

为什么不向组件添加一个 creationComplete 事件侦听器并在处理函数中执行逻辑?另外,您可以尝试制作一个布尔属性,例如

public var isInitialized:Boolean = false;

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

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

于 2012-07-19T18:31:27.273 回答
0

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

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

于 2013-11-23T22:23:50.847 回答