在AS3中,我知道我可以检查是否可以通过在加载的SWF的开头包含这个外部加载的SWF来访问该阶段:
if (stage) {
this.init();
} else {
addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
}
上述解决方案非常适合在执行这些行时检查程序是否可以访问该程序,或者添加一个事件监听器来监听该阶段的可访问时间。
我试图在Flex 4.6中的自定义组件中复制类似的情况。但是,我不是在监听舞台的存在,而是在寻找组件的creationComplete
事件是否被触发。
对于creationComplete
事件是否已被触发,是否有类似的解决方案,如果尚未侦听它,是否会收听?
答案 0 :(得分:3)
当初始化设置为true时,我只是Windows grepped 4.6源和UIComponent调度创建完成事件,因此http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/core/UIComponent.html#initialized应该有效。
修改强> 响应注释初始化被调用但是初始化设置为true不会发生在步骤9,它实际上是在UIComponent中调度CREATION_COMPLETE的位置,请参阅我从4.6源代码中提取的UIComponent:
/**
* 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事件发生在我引用的一个不同的setter中。
public function set processedDescriptors(value:Boolean):void
{
_processedDescriptors = value;
if (value)
dispatchEvent(new FlexEvent(FlexEvent.INITIALIZE));
}
答案 1 :(得分:1)
为什么不向组件添加creationComplete事件侦听器并在处理函数中执行逻辑?另外,你可以尝试制作一个布尔属性,比如
public var isInitialized:Boolean = false;
function creationCompleteHandler(e:Event):void
{
isInitialized = true;
//code here
}
通过这种方式,您可以检查外部来源是否已初始化。
答案 2 :(得分:0)
为什么不只使用applicationComplete而不是creationComplete,因为在检查阶段是否可访问时,applicationComplete是循环的最后一个阶段?我认为每个应用程序组件的creationComplete都必须在applicationComplete之前触发。您是否因为某些原因在应用程序准备好之前尝试访问creationComplete?
我刚刚回过头来看,我不确定你为什么要积极寻求更难的解决方案。这个解决方案应该有效,我个人认为这是正确的解决方案。当然你可以检查一下是否已经触发了creationComplete,但除非你明确需要这个功能,否则当你可以通过利用生命周期来利用逻辑的良好分离时,我无法看到检查creationComplete的重点......