传递具有单个元素的dataprovider(数组)时,Repeater工作不正常

时间:2011-02-24 15:33:05

标签: flex flex4 flash-builder

我在Accordian中使用Repeater,它似乎没有在userArray中看到单个元素。如果我向userArray添加另一个条目,则Repeater工作正常。

思想??

    private function currUsersServiceHandler(event:ResultEvent):void{

                    if (event.result.currentUsers != null)
                    {
                        if (event.result.currentUsers.user is ArrayCollection) // if more than one elements are present
                        {
                            usersArray = event.result.currentUsers.user;
                        } 
                        else if (event.result.currentUsers is ObjectProxy)
                        { //FIXIT usersArray populate by following line has some issue
                            usersArray = new ArrayCollection(ArrayUtil.toArray(event.result.currentUsers));
                        }
                    }
                }

        <mx:HTTPService id="currUsersService" url="currUsers.xml" result="currUsersServiceHandler(event)"/>

<mx:Accordion includeIn="UserList" x="10" y="10" width="554" height="242" >
        <mx:Repeater id="rep" dataProvider="{usersArray}">
            <mx:Canvas width="100%" height="100%" label="{rep.currentItem.firstName}" >
                    <mx:HBox>
                        <s:Label text="{rep.currentItem.firstName}"/>
                        <s:Label text="{rep.currentItem.lastName}"/>
                      <mx:/HBox>
            </mx:Canvas>
        </mx:Repeater>  
</mx:Accordian>

编辑:

我还注意到另一件事,即手风琴确实显示了一个标签(当Array有一个元素时),但它没有标注我正在设置的名字。如果我输入另一个用户,则会出现两个标签,并且两个标签都标有我正在设置的名称。第一个标签也会出现标记。

1 个答案:

答案 0 :(得分:1)

对我来说,这不适用于dataProvider中的1个项目,但是可以使用两个项目。

那就是说,这种方式让我感到困惑,我倾向于远离使用中继器。我建议采用不同的方法。

首先创建一个组件来显示您的数据。您可以重复使用现有代码。概念上是这样的:

        <mx:Canvas width="100%" height="100%"  >
<mx:Script><[[ 
 public var user : Object;
]]></mx:Script>
                <mx:HBox>
                    <s:Label text="{user.firstName}"/>
                    <s:Label text="{user.lastName}"/>
                  <mx:/HBox>
        </mx:Canvas>

然后在原始组件中,在ActionScript中创建组件的新实例:

for each(var myUserObject : Object in usersArray){
  var newUserDisplayObject : UserDisplayObject = new UserDisplayObject();
  newUserDisplayObject.user = myUserObject;
  newUserDisplayObject.label = myUserObject.firstName
  accordian.addChild(newUserDisplayObject);
}