MyComponent.mxml:
<?xml version="1.0"?>
<mx:Canvas ... >
<fx:Script>
[Bindable]
public var headingText:String = "Default Heading Text";
</fx:Script>
<s:VGroup>
<s:Label text="{headingText}" ... />
(INSTANCE MXML)
</s:VGroup>
<mx:Image ... />
</mx:Canvas>
あなたはこのようheadingTextに通してやる:
<my:MyComponent headingText="Custom Heading Text" />
はあなたが渡したい他の単純な値のために同じアプローチに従うことができます。パブリックプロパティを宣言し、バインド可能にしてから、コンポーネント内でデータバインディングを使用してプロパティをその宛先(または宛先)にフックします。
複雑なプロパティ(INSTANCE MXMLなど)でも同じことができます。あなたはそれを使用するときは、次のようになります。
<my:MyComponent>
<my:thePropertyName>
<s:Label text="whatever..." ... />
<(OTHER MXML CONTENT) />
</my:thePropertyName>
<my:someOtherPropertyName>
....
</my:someOtherPropertyName>
</my:MyComponent>
これを実装する方法の例については、Flexフレームワークでspark.components.Group
コンポーネントのmxmlContent
プロパティをチェックアウトすることができます。ソースは長すぎてここに投稿することはできません。ソースに直接オンラインリンクを見つけることはできません。基本的な考え方はこれです(これを行うには、mxmlファイルの<fx:Script>
ブロック内で次のすべてを行うことができます)。
[1] プロパティをタイプArray
として、メタデータArrayElementType
を使用して、配列に含めるタイプを指定します。
[ArrayElementType("mx.core.IVisualElement")]
public function set mxmlContent(value:Array):void {
_mxmlContent = value;
}
private var _mxmlContent:Array;
[2]あなたは、実行時に配列をループにロジックを少し必要とし、コンポーネントの表示リストに配列の内容を追加します。 createChildren
オーバーライドはこれをトリガするのに適しています。以下は、火花Group
のsetMXMLContent()
メソッドの実装から緩やかに導かれます。これは、すべての可能なケースをカバーしていないが、それはあなたが始めるよ:
override protected function createChildren():void {
super.createChildren();
if(_mxmlContent == null) return;
for (i = 0; i < _mxmlContent.length; i++) {
var elt:IVisualElement = _mxmlContent[i];
addElement(elt);
}
}
だから今、あなたのコンポーネントを使用すると、構文を使用して、親MXMLコンポーネントから設定することができた、mxmlContent
というプロパティを持っているでしょう。
<my:MyComponent>
<my:mxmlContent>
... (MXML ELEMENTS HERE) ...
</my:mxmlContent>
</my:MyComponent>
メタデータ:[DefaultProperty("mxmlContent")]
をコンポーネントクラスに適用すると、新しいプロパティをコンポーネントのdefault property
に追加できます。 mxmlからこれを行うには、<fx:Metadata>
要素にメタデータ定義をラップするだけです。 see here for example of fx:Metadata。
は、上記のすべて一緒に入れて、あなたがこのように使用することができます何かを得るでしょう:
<my:MyComponent headingText="Custom Text Here">
(CUSTOM MXML CONTENT HERE)
</my:MyComponent>
編集:
:私はここでノートのカップルを作る必要があります
"Halo"コンポーネント(mx:Canvas
など)はをサポートしていませんと同じですので、代わりにaddChild()
を使用します。
ハローコンポーネントの代わりにスパークコンポーネントを使用する(おそらく)必要があります。意味は、<mx:Canvas>
の代わりに<s:Group>
をベースに使用してください。これを行うと、コンポーネントは上記のmxmlContent
プロパティを継承します。コンポーネントに独自の「コンテンツ」プロパティ(または複数のコンテンツプロパティ)を持たせたい場合は、それらの名前を異なるものにします。
まあまあコンパイル時の解決策ではありませんが、実行時処理を避けることはできません。あなたは確かに多くの感謝に値すると誰も近づいて以来、私はこの答えを受け入れるだろう。 – W3Coder
@ W3Coder:受け入れてくれてありがとう。私はあなたがコンパイル時の解決策を望んでいたことを知っていますが、あなた自身のコードジェネレータを構築することは簡単です。そこに到達する方法はありません。しかし、これは価値があります:これは、子コンテンツを扱うためにFlexフレームワークで使用されているのと同じアプローチです。このように記述されたコンポーネントは、コンパイル時のソリューションと同じように効率的でなければなりません。がんばろう!別の/より良い解決策が見つかったら、私たちに連絡してください。 – Lee