2011-12-20 6 views
1

MXMLクラス内でIFactoryとして宣言されたコンポーネントにアクセスすることは可能ですか?私はスキンパーツでこのような工場宣言スタイルを何度も使用しましたが、MXML内からそれらのファクトリにアクセスする方法は決して分かりませんでした。MXMLクラスの<fx:Declarations>内のコンポーネントにアクセスするにはどうすればよいですか?

は、ここで私が動作するように期待するものの例です:

<fx:Declarations> 
    <fx:Component id="labelDisplay"> 
     <s:Label fontSize="12" fontWeight="bold"/> 
    </fx:Component> 
</fx:Declarations> 

<fx:Script> 
    <![CDATA[ 
     override protected function createChildren():void 
     { 
      super.createChildren(); 

      var label1:Label = labelDisplay.newInstance(); 
      addElement(label1); 

      var label2:Label = labelDisplay.newInstance(); 
      addElement(label2); 

      var label3:Label = labelDisplay.newInstance(); 
      addElement(label3); 
     } 
    ]]> 
</fx:Script> 

*編集*

私は上記のコードは動作します期待していた理由は、動的スキンパーツされている方法に基づいていますスパークスキニングアーキテクチャで処理されます。上記のコードがMXMLスキンクラスの一部であった場合、私のホストコンポーネントでは次のようなことができます。 IFactoryですにコンポーネント>ターン:< FXを何点でのスパークスキンアーキテクチャでは、

[SkinPart(required="true",type="spark.controls.Label")] 
public var labelDisplay:IFactory; 

答えて

1

FlexのSkinnableComponentを掘り、MXMLスキンをAS HostComponentに結びつける方法に基づいてソリューションを見つけました。明らかに、 "labelDisplay"はFlashBuilderのオートコンプリートに具体的なクラスメンバーとして表示されませんが、ダイナミックプロパティとして参照することはできます。

<fx:Declarations> 
    <fx:Component id="labelDisplay"> 
     <s:Label fontSize="12" fontWeight="bold"/> 
    </fx:Component> 
</fx:Declarations> 

<fx:Script> 
    <![CDATA[ 
     override protected function createChildren():void 
     { 
      super.createChildren(); 

      var labelFactory:ClassFactory = this["labelDisplay"]; 

      var label1:Label = labelFactory.newInstance(); 
      addElement(label1); 

      var label2:Label = labelFactory.newInstance(); 
      addElement(label2); 

      var label3:Label = labelFactory.newInstance(); 
      addElement(label3); 
     } 
    ]]> 
</fx:Script> 
0

問題は、iFactoryを作成していないため、iFactoryメソッドにアクセスできないことです。

ActionScriptにドロップし、必要に応じて実際にiFactoryを作成することをお勧めします。これは、その後、あなたのcreateChildrenコードがあるとして動作するはずClassFactoryクラス

protected var labelDisplay: iFactory = new ClassFactory(spark.controls.Label); 

を使用しています。

+0

私は、上記のMXMLがスキンの場合にどのようにコードが解釈されるかを比較しています。そうであれば、私のホストコンポーネントで、私は以下のことができました(下記)。 Sparkのスキニングアーキテクチャでは、はどの時点でIFactoryに変換されますか? '[SkinPart(必須= "true"、type = "spark.controls.Label")]' '' public var labelDisplay:IFactory; ' –

+0

SkinPartはコンポーネントの視覚的な部分です。 IFactoryは視覚的なものではありません。他のクラスを作成するクラスです。たとえあなたがスキンを作成していたとしても。私はまだActionScriptでIFactoryを定義します。 IFactoryをコンポーネントクラスで定義する場合は、 hostComponentプロパティを使用してスキンクラスからアクセスできます。もっと知りたい場合は、ListクラスとListSkinコードを調べてください。 – JeffryHouser

+0

私がしようとしていることは、単に間違っているように見えます。ここでは、単にASでIFactoryを作成し、それをASで使用することがより明確になります。しかし、私がIFactoryから欲しいのは、既に記入されたフォント、サイジング、カラー、および位置情報を備えた、完全にカスタマイズされたラベルです。 MXMLを使ってすべてのことを宣言するのははるかに簡単です。 –

関連する問題