我正在开发一个自定义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的语法感到困惑。这似乎应该很容易,但我还没有找到答案。非常感谢任何帮助。
答案 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中设置它们即可。