1

我有一个使用该Repeater组件构建一组单选按钮的 flex MXML UI:

<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“foo”,例如,我想要一个Button,或者如果这是“酒吧”我想要一个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>
4

3 回答 3

4

正确的(也是唯一明智的)方法是使用普通的 ol'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 中完成了它。

于 2009-07-17T21:13:21.857 回答
2

我认为您必须在任何条件下使用操作脚本。mxml 中似乎不存在条件语句。尽管您可以同时包含这两个元素并使用 inline as 来设置可见状态。

<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

于 2009-07-17T20:33:27.210 回答
0

我会为此使用 AS3。我的观点是,最好使用 mxml 进行显示,使用 AS3 进行逻辑......类似于.Net 中的代码隐藏

于 2009-07-17T20:36:37.123 回答