我有一个flex MXML用户界面,它使用Repeater
组件构建一组单选按钮:
<mx:Repeater id="radios"
dataProvider="{_lists.(@id == _question.single.@response_list).group.listItem}">
<mx:RadioButton groupName="responses"
label="{radios.currentItem.@text}"
data="{radios.currentItem.@level}"/>
</mx:Repeater>
我想要做的是让转发器中的组件 - 本例中的RadioButton
- 根据radios.currentItem
的属性值进行选择:如果currentItem
的值1}}是“foo”,例如,我想要Button
,或者如果它是“bar”我想要RadioButton
。是否可以在MXML组件中执行此类条件构造,还是必须还原到ActionScript才能执行此操作?
我正在考虑这些方面的事情:
<mx:Repeater id="r" dataProvider="{list}">
<mx:If test="{r.currentItem.@type == 'radio'}">
<mx:RadioButton label="{r.currentItem.@text}" />
</mx:If>
<mx:If test="{r.currentItem.@type == 'specify'}">
<custom:Specify label="{r.currentItem.@text}" />
</mx:If>
</mx:Repeater>
答案 0 :(得分:4)
正确(并且真正唯一合理)的方法是使用简单的'for
循环和ActionScript:
for each (var o:Object in yourDataProvider)
{
if (o.someProperty)
{
var rb:RadioButton = new RadioButton();
yourContainer.addChild(rb);
}
else
{
var s:Specify = new Specify();
yourContainer.addChild(s);
}
}
你可以像slashnick建议那样做,只需在Repeater的每次迭代中添加两个组件,根据某种类型的测试切换它们的显示(在这种情况下,我可能会建议将includeInLayout
属性包含为好吧),但你这样做会让你的显示列表膨胀,并且它不会扩展 - 最终,你最终还是会在ActionScript中完成它。
答案 1 :(得分:2)
我认为你必须在任何条件下使用动作脚本。 mxml中似乎不存在条件语句。虽然您可以包含这两个元素并使用内联来设置可见状态。
<mx:Repeater id="r" dataProvider="{list}">
<mx:RadioButton label="{r.currentItem.@text}" visible="{r.currentItem.@type == 'radio'}" />
<custom:Specify label="{r.currentItem.@text}" visible="{r.currentItem.@type == 'specify'}" />
</mx:Repeater>
有关更多示例,请参阅http://www.firemoss.com/post.cfm/Powerful-MXML-Bindings-with-Ternary--Operators。
答案 2 :(得分:0)
我会使用AS3。我的观点是最好使用mxml作为显示器,使用AS3作为逻辑......类似于.Net中你有代码隐藏的方式