Повторитель не работает нормально, когда передан провайдеру данных (массиву), имеющему один элемент - PullRequest
0 голосов
/ 24 февраля 2011

Я использую Repeater в Accordian, который, кажется, не видит ни одного элемента в userArray. Если я добавлю еще одну запись в userArray, то репитер будет работать нормально.

Мысль ??

    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>

Edit:

Есть еще одна вещь, которую я только что заметил, то есть, что аккордеон действительно показывает одну вкладку (когда у массива есть один элемент), но она не помечена именем, которое я задаю. Если я введу другого пользователя, появятся две вкладки, и обе будут помечены именами, которые я задаю. Первая вкладка тоже помечена.

1 Ответ

1 голос
/ 24 февраля 2011

Мне не имеет смысла, что это не будет работать с 1 элементом в dataProvider, но будет работать с двумя.

Тем не менее, этот подход кажется мне запутанным, и я склонен вообще избегать использования ретрансляторов. Я бы предложил другой подход.

Сначала создайте компонент для отображения ваших данных. Вы можете повторно использовать существующий код. Концептуально что-то вроде этого:

        <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);
}
...