2011-08-04 144 views
0

我已經在Flex 4中編寫了一些自定義組件,並且遇到了這個問題幾次。MXML類的初始化順序

var myForm:MyForm = new MyForm; 
myForm.SetData(data); 
addElement(myForm); 

現在想象一下,我從一個面板或VGroup(或任何其他容器)的非構造函數調用這些函數。令人煩惱的是,在MyForm.SetData()期間,並非所有在那裏聲明的myForm的所有字段都已經初始化。如:

<s:VGroup id="dataGroup"> 

如果我的SetData() - 函數想要訪問dataGroup時(爲理由.addElement()剛剛收到的數據的話),它只是失敗,出現空指針異常,因爲dataGroup時不盡管這是在構造函數之後創建的。如何保證表單完全初始化?

回答

3

聆聽creationComplete事件並在事件處理程序中添加組件是實現此目的的一種方法。這就是Sam DeHaan所建議的。

另一種方法是重寫createChildren()函數。這是創建並添加組件的所有子組件的函數。代碼會是這個樣子:

override public function createChildren():void 
{ 
    super.createChildren(); 

    var myForm:MyForm = new MyForm; 
    // Note that data may be null here, best to 
    // override commitProperties() to set it. 
    myForm.SetData(data); 
    addElement(myForm); 
} 

docs on the component lifecycle將提供有關這個主題的一噸的細節。

+0

這正是我正在尋找的文檔。 –

+0

@kdansky,那麼你應該接受這個答案:) –

1

除非我誤解你的問題,

你應該把運行到一個creationComplete回調,你需要定義的容器上這個空指針異常的代碼。

+0

除了使用回調之外沒有別的方法嗎?我真的更喜歡控制這些函數執行的順序,否則我將不得不用內部標誌來編寫一個討厭的解決方法。 –

+0

這不是很好,但你可以使用callLater,很可能。類似於:: callLater(addElement,[myForm])。然而,如果你不在VGroup/Panel等內部,你不能調用Later(dataGroup.addElement ...)。當一個callLater等到下一幀時,你*可以*取決於你的應用程序能夠信任VGroup已經被創造了。 –