2011-06-04 47 views
0

我正在處理一個自定義Flex 4組件,它是兩個現有Flex組件的聚合。我希望能夠爲組件指定自己的自定義屬性以及通過MXML訪問現有的公共子組件屬性。例如,我可能想要調整標籤和文本輸入的字體顏色或樣式。什麼是MXML語法來分配自定義MXML組件的子組件屬性?

它彙集一個標籤和文本輸入的玩具組件:

<?xml version="1.0" encoding="utf-8"?> 
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    > 
<fx:Script> 
    <![CDATA[ 
     [Bindable] public var prompt:String = "default prompt"; 
     [Bindable] public var input:String = "default inpput"; 
    ]]> 
</fx:Script> 
<s:VGroup> 
    <s:Label id="cLabel" text="{prompt}" /> 
    <s:TextInput id="cTextInput" text="{input}" /> 
</s:VGroup> 
</s:Group> 

然後在我的主要應用程序,我想通過MXML訪問子組件的公共接口,而無需重新編寫了一通通過每個綁定。喜歡的東西:

... 
<local:myInput prompt="name" input="please enter name"> 
    <local:cLabel color="0xffffff" /> 
    <local:CTextInput fontStyle="bold" /> 
</local:myInput> 

在ActionScript一個可以爲所有的公共屬性做到這一點很容易:

myInput.cLabel.color = "0xffffff"; 

但我難倒關於語法的MXML。這似乎應該很容易,但我還沒有找到答案。任何幫助不勝感激。

回答

1

您不能將顯示層次與MXML標記/值進行菊花鏈連接。您可以按照您的指定在ActionScript中執行此操作,但即使這樣做也可能被認爲是不正確的做法。

我會指出標籤上的color和TextInput上的fontStyle不是屬性。他們是風格所以,你有代碼:

myInput.cLabel.color = "0xffffff"; 

很可能會拋出一個錯誤,因爲顏色不屬性。你必須使用這樣的代碼:

myInput.cLabel.setStyle('color',"0xffffff"); 

但是,由於樣式通常由孩子繼承;我懷疑在頂級組件中,您可以設置樣式,並且它會立即自動傳遞給兒童。所以,你應該能夠做到:

myInput.setStyle('color',"0xffffff"); 

或者在MXML:

<local:myInput prompt="name" input="please enter name" color="0xffffff" fontStyle="bold" > 
</local:myInput> 

它應該往下淌。如果你想在子組件上單獨設置樣式,事情會變得更復雜。

但是,回到你原來的問題W /問候屬性。要保持組件封裝,您應該創建在子組上設置的屬性。類似這樣的:

private var _property : String; 
public function get property():String{ 
return _property; 
} 
public function set property(value:String){ 
_property = value; 
myChildComp.property = value; 
} 

它可以吸如果你需要做很多屬性。如果封裝這個組件不是一個優先事項;只需在ActionScript中設置它們即可。

+0

感謝您澄清樣式值,我應該使用一個更好的例子,這取決於屬性。 IMO爲集合類的每個接口編寫getter和setter會導致耦合更緊密,比如果只能組合正交類。我想我只需要習慣寫很多鍋爐板,如果我想組合組件。另一個選擇是創建一個MXML模板類,並將所有組件作爲參數傳入?像Flex Form類一樣? – crcarlson 2011-06-04 21:24:19