views:

32

answers:

1

Hi there! I've been kinda stuck in trying to organize data and bind them to a Repeater in one my applications. What I did at first, was to save an array of arrays, so that I could've accessed any value very easily. But then I realized that I needed to bind them to a Repeater, so I had to switch to an ArrayCollection of arrays. But the Binding issues weren't solved, since there are still arrays (not bindable) inside the ArrayCollection. So, what can I do??

Below an example of what I want to do:

<mx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;
        [Bindable] public var arr:ArrayCollection = new ArrayCollection(
            [[              {v:"1", s:"f"}, {v:"1", s:"p"}, {v:"1", s:"c"}, {v:"1", s:"q"}
            ], [
                {v:"1", s:"f"}, {v:"1", s:"p"}, {v:"1", s:"c"}, {v:"1", s:"q"}
            ]]
        );
        protected function button1_clickHandler(event:MouseEvent):void
        {
            trace(arr.getItemAt(0).length);
             arr.getItemAt(0).splice(0, 1);
             trace(arr.getItemAt(0).length);
        }

    ]]>
</mx:Script>
<mx:HBox>


<mx:Repeater id="rep" dataProvider="{arr.getItemAt(0)}">
    <mx:Label text="{rep.currentItem.v}" />
</mx:Repeater>
    <mx:Button label="del" click="button1_clickHandler(event)" />
</mx:HBox>

the traces show that the array size changes, but the repeater doesn't update. Any idea?? What's the best practise?

+1  A: 

Binding updates a destination when the source changes. In complex objects--such as an array--that source is a pointer to some other memory location. In this situation you are not changing the source; only the item the source points at. And therefore binding will have no affect.

That said, repeaters are unusual beasts and I suggest you don't use one. Use a list based class, such as a List. This will be less performance intensive than using a repeater, thanks to renderer recycling.

Inside the list based class; your dataProvider is turned into a ListCollectionView; and it in turn listens for the CollectionChange event of your dataProvider to modify the displayed items when elements in the dataProvider change. You have no such code when using a repeater.

www.Flextras.com
very clear! thank you! I'll avoid repeaters as much as I can
Alberto M