2012-07-19 64 views
3

在AS3,我知道我可以檢查階段是可訪問的,比如說,外部加載SWF通過包括這個在加載的SWF的開頭:的Flex 4.6檢查creationComplete已發生

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

的上述解決方案非常適用於在執行這些行時檢查程序是否可以訪問該階段,或者添加事件偵聽器來偵聽階段是否可訪問。

我想在Flex 4.6中的自定義組件中複製類似的情況。然而,我不是在聽聽舞臺的存在,而是在尋找組件的creationComplete事件是否已被觸發。

對於creationComplete事件是否已被觸發,是否有類似的解決方案,並且如果它沒有被偵聽呢?

+0

你調查過[Flex組件的生命週期(http://help.adobe.com/en_US/flex/using/WS460ee381960520ad-2811830c121e9107ecb-7fff.html#WS460ee381960520ad-2811830c121e9107ecb-7ffc)? – NoobsArePeople2 2012-07-19 18:35:31

+0

@ NoobsArePeople2是的,我有。 – 2012-07-19 19:11:32

回答

3

我只是Windows的grepped 4.6源和UIComponent調度創建完成事件初始化設置爲true時,所以http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/core/UIComponent.html#initialized應該工作。

編輯 在迴應評論初始化的調用,但設定初始化爲真,在第9步不發生它的字面其中CREATION_COMPLETE是內UIComponent派出看到這個片段,我從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)); 
    } 
} 

如果你不相信我,按Ctrl + Shift鍵在UIComponent + T類型,然後搜索「變量:創世紀」,你會得到一個啓動部分註釋塊,其中啓動事件被派遣和一些vari用於標記那些正在完成的事件的標記被設置。 INITIALIZE事件發生在我引用的下面的另一個setter中。

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

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

感謝您的輸入,但您使用的引用是Flex 3的一部分。[Flex 4.6組件生命週期](http://help.adobe.com/en_US/flex/using/WS460ee381960520ad-2811830c121e9107ecb-7fff.html#WS460ee381960520ad-2811830c121e9107ecb-7ffc)顯示初始化發生在第9步,但'creationComplete'不是直到步驟14.b.話雖如此,我敢肯定「初始化」並不能完全削減我的情況。不過謝謝你! – 2012-07-20 04:55:48

+0

感謝您的回覆,請讓我知道這是否會因爲任何原因而出現問題,因爲我以前也必須自己這樣做,並且總是覺得應該提供一些信息來了解這些事件是否已經被解僱,這對我來說也是有用的信息。 – shaunhusain 2012-07-20 17:46:49

1

爲什麼不添加一個creationComplete事件監聽器到你的組件並執行處理函數中的邏輯?也可以嘗試製作一個布爾屬性,如

public var isInitialized:Boolean = false; 

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

這樣,您可以從外部來源檢查它是否已被初始化。

+0

我知道我可以做到這一點,但它總是看起來像解決問題的「簡單」方式。我只是想知道Flex是否提供了另一種方式來檢查這些情況。謝謝您的意見。 – 2012-07-19 19:11:17

+0

嗯,我想不出任何其他的東西..知道一個'簡單'的方式雖然總是一件好事:) – Gio 2012-07-19 21:17:53

0

爲什麼不直接使用applicationComplete而不是creationComplete因爲applicationComplete是檢查,看看舞臺訪問時最後階段的循環?我會想象每個應用程序組件的creationComplete必須在applicationComplete之前觸發。您是否在應用程序因某種原因準備好之前嘗試訪問creationComplete?

我剛剛回過頭來看,我不確定你爲什麼要積極尋求更難的解決方案。這個解決方案應該可以工作,並且我個人覺得它是正確的。當然你可以檢查一下creationComplete是否已經觸發了,但是除非你明確需要這個功能,否則當你確實可以利用生命週期的優勢分離邏輯時,我看不到檢查creationComplete的意義。