2009-08-24 7 views
2

基本的には、 子(Form、FormItems、Buttons ...)のPanelであるMyView.mxmlファイルがあるとします。Flexコンポーネントを表示する前にイントロスペクションする方法

MyViewを反復して、 の子(型、id ...)に関するすべての情報を表示することは可能ですか?

私はこの機能を持っている場合

public function iterateOverChildren(comp:Container):void { 
     // Get the number of descriptors. 
     trace("Running iterateOverChildren for " + comp.id); 
     if (comp != null) 
     { 
     var n:int = comp.childDescriptors.length; 
     for (var i:int = 0; i < n; i++) { 
      var c:ComponentDescriptor = comp.childDescriptors[i]; 
      var d:Object = c.properties; 

      // Log ids and types of objects in the Array. 
      trace(c.id + " is of type " + c.type); 

      // Log the properties added in the MXML tag of the object. 
      for (var p:String in d) { 
       trace("Property: " + p + " : " + d[p]); 
      } 
     } 
     } 
    } 

なぜこの呼び出しは動作しません私のMain.mxmlで

var myV = MyView(); iterateOverChildren(myV);

私は addChild(myV)のようなステートメントを追加すると動作します。 iterateOverChildren呼び出しの前に を呼び出します。 (しかし、それは私が欲しいものではありません、私は を表示するためにそれを追加せずに繰り返します)。私はこの http://livedocs.adobe.com/flex/3/html/help.html?content=layoutperformance_06.html

を読んだとき

は、私が「childDescriptors」方法は、ライフサイクルから独立しており、それは私が画面に追加することなく、コンポーネントをイントロスペクトしましょうと思いました。私は何を取りこぼしたか ?表示する前にコンポーネントをイントロスペクションする方法

+0

MyViewのすべての子を正確に反復しようとしているのはなぜですか?探している情報に応じて、複数の方法があります。 – Simon

+0

私は、バックエンドのユーザー役割ごとに各アイテム(子)のメタデータを持っています。以前はすべてのメタデータを持っていましたが、アプリケーションが大きくなり、バックエンドから関連するメタデータだけを取り除きたいと思っています。私はインスタンス化する前にMyViewからこれらすべてのid(メタデータのための私のキー)を見つけるために何かを動的に書く必要があります。私はgetChildrenの結果がcreationPolicyに依存していることを知っています。だから、私がchildDescriptorsについて読んだとき、それは私が探していたもののように見えました。 –

答えて

2

Flexでは、コンポーネントのインスタンス化には複数の方法があります。

ActionScriptでコンストラクタを使用すると、オブジェクト自体の構築だけが完了したベアメタルオブジェクトが取得されます。特に、この新しいオブジェクトはまだ子ビューをインスタンス化していないため、getChildren()の結果を見ると何も表示されません。

コンポーネントをMXMLで書き留めた場合、MXMLコンパイラは「実」オブジェクトではなくComponentDescriptorsを作成します。これらは、オブジェクトに対してMXML(プロパティ、バインディング、イベントハンドラなど)で指定したすべての情報を保持し、ランタイムはそれらを使用して適切な時点で実際のオブジェクトを作成します。 「適切な時間」は、通常、「オブジェクトが表示リストに追加されたとき」を意味します。そのため、addChild()(技術的には、addChild()を呼び出した直後ではなく、新しくインスタンス化されたオブジェクトがcreationCompleteイベントを送出した後でのみ)を呼び出した後に子どもが表示されます。

+0

ありがとうサイモン。私はまだ100%、getChildren()に対するchildDescriptorsの使用を理解していないと思います。 "すべてのコンテナにはchildDescriptorsプロパティがあります creationPolicyプロパティの値によっては、コンテナ内のコントロールのインスタンシエートが即座に開始されるか、インスタンシエーションが延期されると、この配列のプロパティを使用して各コンポーネントのComponentDescriptorを作成し、指定された時刻にそのオブジェクトを作成します。 上記の説明は、ディスクリプタがすぐに利用できないと解釈していますか? –

+0

記述子はすぐに使用できますが、MXMLコードで作成されたオブジェクトの場合にのみ使用できます。 'var myV = MyView();'のようにコンストラクタを呼び出すことによってActionScriptでオブジェクトをインスタンス化すると、childDescriptorsを持たない実際のオブジェクトが得られます。 – Simon

+0

ありがとうございました。 これを行うと var myV = MyView(); myV.initialize(); iterateOverChildren(myV); 私は情報を得ます。 これを再帰的にするにはどうすればよいですか?私のiterateIVerChildrenコードでは、var cはComponentDescriptorです。 cの子供を見つけることはできますか? –

関連する問題