Use a setter function.  Assign the dataProvider of the component's
repeater in the setter function.  If it is so easy to debug the binding,
why are you having a problem?

 

Tracy

 

________________________________

From: [email protected] [mailto:[EMAIL PROTECTED] On
Behalf Of nkopcsek
Sent: Tuesday, January 08, 2008 11:24 AM
To: [email protected]
Subject: [flexcoders] Re: Nested Repeaters: Weird Behaviour

 

Hi Tracy,

I simplified my original application to be able to concentrate on the
problem itself.
Since a VBox doesn't have a dataProvider that name is free for use. Also
i'm not that much interested in code beautifing here ;d.
The setter function is also not really needed because you can debug with
ChangeWatchers and it also doesn't work with a fully typed model (as in
my original App).

The problem is the following:

*       The ArrayCollection fires a collectionChanged Event
*       The Repeater whats to update the view recycling the existing
elements
*       The Repeater first goes through its children and updates their
bindings, which again updates the bindings of their children

        *       The repeater of the RepeaterComponent doesn't do
anything, but the out repeater manipulates its childen
        *       This is the point where everything goes wrong. Somehow
all children of RepeaterComponent are updated the way to use the
repeaterIndex of the outer Repeater, and that's the reason why I get
11,11,11 instead of 11,12,13

*       The Repeater adds the new element


--- In [email protected], "Tracy Spratt" <[EMAIL PROTECTED]> wrote:
>
> First, don't use the names of existing properties, methods or classes
> for your component, or variable names. Specifically "dataProvider" and
> "data".
> 
> 
> 
> Next, use a setter function instead of a public property, so you can
> debug the values being passed in. Type the setter function as
> specifically as you can, avoid Object.
> 
> 
> 
> ________________________________
> 
> From: [email protected] [mailto:[EMAIL PROTECTED]
On
> Behalf Of nkopcsek
> Sent: Tuesday, January 08, 2008 9:51 AM
> To: [email protected]
> Subject: [flexcoders] Nested Repeaters: Weird Behaviour
> 
> 
> 
> Hi,
> 
> I got some really strange behaviour with nested repeaters.
> In this case a repeater is part of a component which is repeated
itself
> (let's call this component RepeatedComponent, see below for code).
> Whenever I add a new item to the dataProvider of the outer repeater it
> doesn't add only the new RepeatedComponent but also updates the
children
> of the other components in an unintended way.
> 
> Instead of
> 
> 1
> 11 12 13
> 2
> 21 22 23
> 3
> 31 32 33
> x
> x y z
> 
> I get
> 
> 1
> 11 11 11
> 2
> 22 22 22
> 3
> 33 33 33
> x
> x y z
> .
> 
> The strange thing is that all the children of Repeater of the
> RepeatedComponent get the same repeaterIndex as the RepeatedComponent
> itself.
> 
> Thanks in advance for any hints. Any other solution or even a
workaround
> would help me.
> 
> 
> Code:
> 
> [RepeatedComponent.mxml]
> <?xml version="1.0" encoding="utf-8"?>
> <mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml";>
> <mx:Object id="dataProvider"/>
> <mx:Label text="{dataProvider.label}"/>
> <mx:Repeater id="r" dataProvider="{dataProvider.data}" width="100%"
> recycleChildren="true">
> <mx:Label text="label: {r.currentItem.label}"/>
> </mx:Repeater>
> </mx:VBox>
> 
> [Test.mxml]
> <?xml version="1.0" encoding="utf-8"?>
> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml";
> layout="absolute" xmlns:local="*">
> <mx:Script>
> <![CDATA[
> import mx.collections.ArrayCollection;
> 
> [Bindable]
> private var dataProvider:ArrayCollection = new
> ArrayCollection([
> {label:"1", data:new
> ArrayCollection([{label:"11"},{label:"12"},{label:"13"}])},
> {label:"2", data:new
> ArrayCollection([{label:"21"},{label:"22"},{label:"23"}])},
> {label:"3", data:new
> ArrayCollection([{label:"31"},{label:"32"},{label:"33"}])}
> ]);
> 
> private function addItem():void {
> dataProvider.addItem({label:"x", data:new
> ArrayCollection([{label:"x"},{label:"y"},{label:"z"}])});
> }
> ]]>
> </mx:Script>
> <mx:VBox>
> <mx:Repeater id="r" dataProvider="{dataProvider}" width="100%"
> recycleChildren="true">
> <local:RepeatedComponent dataProvider="{r.currentItem}"/> 
> </mx:Repeater>
> <mx:Button label="ClickMe" click="addItem()"/>
> </mx:VBox>
> </mx:Application>
>

 

Reply via email to