2011-08-04 13 views
0

私はFlex 4にカスタムコンポーネントをいくつか書き、この問題を数回実行しました。MXMLクラスの初期化手順

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

ここで、PanelまたはVGroup(または他のコンテナ)の非コンストラクタ関数からこれらの関数を呼び出しているとします。 Annoyingly、MyForm.SetData()中に、そこで宣言されているmyFormのすべてのフィールドが初期化されているわけではありません。以下のような:

<s:VGroup id="dataGroup"> 

もし私をSetData() - データグループではないので、関数は、それだけでnullポインタ例外で失敗(.addElementの理由()それまでのデータを受け取ったため)データグループにアクセスしようこれがコンストラクタの後にあるにもかかわらず、まだ作成されていません。フォームが完全に初期化されたことをどのように保証できますか?

答えて

3

イベントをリッスンし、イベントのハンドラでコンポーネントを追加することは、これを行う1つの方法です。これはSam DeHaanが提案したものです。

もう1つの方法は、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コールバックでこのnullポインタ例外に実行されるコードを置く必要があります。

+0

そのコールバックを使用する以外の方法はありますか?私は本当にこれらの関数が実行される順序を制御することを好みます。そうでなければ、内部フラグを使って厄介な回避策を書く必要があります。 –

+0

それはかなりではありませんが、おそらくcallLaterを使うことができます。 :: callLater(addElement、[myForm])のようなものです。ただし、VGroup/Panelなどの内部にいない場合は、callLater(dataGroup.addElement ...)を呼び出すことはできません。callLaterが次のフレームまで待機するので、アプリケーションによってはVGroupを信頼できる可能性があります作成されました。 –

関連する問題