在自定义MXML组件中分配子组件属性的MXML语法是什么?

时间:2011-06-04 19:50:32

标签: flex syntax mxml

我正在开发一个自定义Flex 4组件,它是两个现有flex组件的聚合。我希望能够为组件指定我自己的自定义属性,以及通过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>

在动作中,人们可以轻松地为所有公共财产做到这一点:

myInput.cLabel.color = "0xffffff";

但我对MXML的语法感到困惑。这似乎应该很容易,但我还没有找到答案。非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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>

它应该涓涓细流。如果你想在子组件上单独设置样式,事情会变得棘手。

但是,回到你关于财产问题的原始问题。要保持组件封装,您应该创建在子项上设置的属性。像这样:

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

如果您需要为很多属性执行此操作,可能会很糟糕。如果封装此组件不是优先事项;只需在ActionScript中设置它们即可。