2009-11-12 70 views
0

我有一個簡單的組件,我創建了我的主要程序實例,像這樣:Flex的實例化的對象 - 等待creationComplete

newMessage = new MessageDetail(); 
newMessage.body.text = "Hello World"; 

我收到錯誤「無法訪問空對象的屬性或方法參考「在第二行,因爲newMessage沒有完全創建之前,擊中第二行代碼試圖設置我的」身體「textarea的文本。我知道我可以構建一個「creationComplete」事件處理程序,但是沒有更簡單的方法來執行此操作嗎?

回答

2

都不要訪問的子組件。

而是在您的組件上定期生成常規屬性。讓組件將這些值綁定到可視化組件。

例如:

MyComponent.MXML:

<mxml blah blah blah> 

<script> 
    [Bindable] public var bodyText; 
</scipt> 


<mx:TextArea text="{bodyText}" /> 
</mxml> 

在您的代碼:

myComponent = new MyComponent() 
myComponent.bodyText = "Hello World!"; 

在一般情況下,我相信子組件在默認情況下被公開是一個巨大的錯誤柔性。

0

我可以推薦創建通過覆蓋方法createChildren()創建組件中的所有孩子。它會確保所有的孩子都被實例化。更多herehere

public class MessageDetail() 
    { 

     // ... 
     private var body:TextArea; 
     // ... 

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

      body = new TextArea(); 
      addChild(body); 
     } 

編輯:

newMessage = new MessageDetail(); 
addChild(newMessage); // During this step all children will to be initialized 
newMessage.body.text = "Hello World"; 

感謝Michael布魯爾 - 戴維斯發表評論

+0

這是真的,但不相關 - createChildren()方法在這裏很好。但是直到初始化()之前它才被調用,即當對象被添加到顯示列表時。 – 2009-11-12 19:39:31

+0

因此,使用這種方法,我不能真正使用設計視圖來看看它看起來會是什麼樣子?我的MessageDetail組件有大約8個子組件。如果有一個等待函數等待指定的對象加載,那將會很好。 – 2009-11-13 05:41:24

+0

我的觀點是,即使沒有自定義的createChildren()方法,使用addChild()編輯的代碼也可以工作。 – 2009-11-13 18:39:43