[flexcoders] Repeater refresh bug?

2007-05-09 Thread Alain Thibodeau
Hi All,
I am having a problem with nested Repeater controls not refreshing properly to 
reflect the data that is bound to the data provider for each of the Repeater 
controls. My problem is related to the following:
 
I have two classes, say Parent and Child which are as follows:
 
[Bindable]
public class Parent {
  public var children : ArrayCollection = new ArrayCollection();
}
 
[Bindable]
public class Child {
  public var name : String = “foo”;
  public var isEnabled : Boolean = true;
  public var isSelected : Boolean = false;
  public var enabledChildren : ArrayCollection = …;
  public var disabledChildren : ArrayCollection = …;
}
 
The enabledChildren and disabledChildren collections contain references to 
other Child objects that exist within the children collection of another parent.
 
Then I have the following nested Repeater control structure:
 
mx:Repeater id=parentRepeater dataProvider={model.parents}
mx:Repeater id=childRepeater dataProvider={ 
parentRepeater.currentItem.options} 
mx:CheckBox label={childRepeater.currentItem.name} 
 enabled={childRepeater.currentItem.isEnabled}
 selected={childRepeater.currentItem.isSelected} 
 click=optionClicked(event); /
  /mx:Repeater
/mx:Repeater
 
Where model.parents references an ArrayCollection of Parent objects.
 
The problem that I am having is that when a checkbox is clicked, the 
optionClicked function is called, and within this function there is logic that 
iterates over the enabledChildren and disabledChildren collections of the Child 
object bound to the clicked checkbox, and it sets the isEnabled and isSelected 
properties of each Child object in these collections to either true or false, 
depending on the current state of the checkbox that was clicked.
 
However, when I do this, the checkbox controls are not updated properly, as the 
enabled and/or selected state of the checkbox does not accurately reflect the 
value that is stored in the object that is bound to this control.
 
The only way that I am able to have the checkboxes redraw properly is to do a 
manual refresh on the model.parents collection, but doing so causes the view to 
flicker pretty noticeably.
 
Is there any way to perform this type of operation and have all of the controls 
update properly without having to do the manual refresh? I know that the data 
that is bound to the controls is being updated properly, but the actual view of 
the controls is not being updated.
 
Any help that could be offered on this matter would be greatly appreciated.


  Ask a question on any topic and get answers from real people. Go to 
Yahoo! Answers and share what you know at http://ca.answers.yahoo.com

Re: [flexcoders] Repeater Refresh

2007-03-26 Thread Ariel Jakobovits
Isn't an ArrayCollection essentially equivalent to a Query?

An array of objects...

Adobe and Macromedia are the same, CF and Flex sleep together, why don't they 
just call it a day?

- Original Message 
From: Douglas Knudsen [EMAIL PROTECTED]
To: flexcoders@yahoogroups.com
Sent: Saturday, March 24, 2007 6:48:59 PM
Subject: Re: [flexcoders] Repeater Refresh









  



ArrayCollection is the path to enlightenment, yes, but a 
metaphysical nudge along this path is binadability

[Bindable]

public var myArrayCollection = new ArrayCollection( myArray);

DK


On 3/24/07, Jeffry Houser [EMAIL PROTECTED] com
 wrote:












  







 I've done this with an ArrayCollections, but never with an
Array.  The code would be something like this:


mx:Script

![CDATA[

public var myArray:Array = ['test1','test2','test3'];

public var myArrayCollection = new ArrayCollection( myArray);


public function addItem():void{

myArrayCollection. addItem('test4');

}

]]

/mx:Script

mx:VBox

mx:Repeater id=rp
dataProvider={myArrayCollection} 

mx:TextInput id=myRepeat /

/mx:Repeater

mx:Button label=click me click=addItem();
/

/mx:VBox




 A few caveats...  

a) I didn't test this code 

b) In my situation, I wasn't adding from the same component that was
displaying things, so the 'add' and 'display were never shown at the same
time.  There could have been other code that made the refresh work,
but I don't remember anything explicit. 

c) When accessing a repeater element you use currentIndex when it is
repeating, but repeaterIndex after the fact.  I haven't found a
simple way to switch between the two of them, but my solution was
something like this:


try{

return myArrayCollection. getItemAt( loop.currentInde x );

}

catch (e:Error){

return myArrayCollection. getItemAt( loop.repeaterInd ex );

}

 I imagine there must be a better way




At 05:35 PM 3/24/2007, you wrote:


here is a little test to
illustrate what I am trying to do (except it doesn't work.)  I was
hoping that updating the dataProvider would add another item to the
repeater...


mx:Script

![CDATA[

public var
myArray:Array =
['test1','test2'
,'test3'];




public function
addItem():void{

myArray.push('test4');

}

]]

/mx:Script

mx:VBox

mx:Repeater id=rp
dataProvider={
myArray}


mx:TextInput
id=myRepeat
/

/mx:Repeater

mx:Button label=click
me click=addItem();
/

/mx:VBox







On Mar 24, 2007, at 5:16 PM, Kevin wrote:


I have a repeater (adding
TextInput fields) that is bound to an 

ArrayCollection on my model. I was hoping that essentially I could 

add a row by just pushing a value into my ArrayCollection on the 

model. However, this isn't working. I assume I need to also 

refresh the repeater, but can't seem to figure out the best
way to 

do that.


Thanks, Kevin

 


--

Jeffry Houser, Software Developer, Writer, Songwriter, Recording
Engineer

AIM: Reboog711  | Phone: 1-203-379-0773

--

My Company:

http://www.dot- com-it.com 

My Podcast:

http://www.theflexs how.com

My Blog:

http://www.jeffryho user.com 

Connecticut Macromedia User Group:

http://www.ctmug. com







  



















-- 
Douglas Knudsen
http://www.cubiclem an.com
this is my signature, like it?


  







!--

#ygrp-mlmsg {font-size:13px;font-family:arial, helvetica, clean, sans-serif;}
#ygrp-mlmsg table {font-size:inherit;font:100%;}
#ygrp-mlmsg select, input, textarea {font:99% arial, helvetica, clean, 
sans-serif;}
#ygrp-mlmsg pre, code {font:115% monospace;}
#ygrp-mlmsg * {line-height:1.22em;}
#ygrp-text{
font-family:Georgia;
}
#ygrp-text p{
margin:0 0 1em 0;}
#ygrp-tpmsgs{
font-family:Arial;
clear:both;}
#ygrp-vitnav{
padding-top:10px;font-family:Verdana;font-size:77%;margin:0;}
#ygrp-vitnav a{
padding:0 1px;}
#ygrp-actbar{
clear:both;margin:25px 0;white-space:nowrap;color:#666;text-align:right;}
#ygrp-actbar .left{
float:left;white-space:nowrap;}
.bld{font-weight:bold;}
#ygrp-grft{
font-family:Verdana;font-size:77%;padding:15px 0;}
#ygrp-ft{
font-family:verdana;font-size:77%;border-top:1px solid #666;
padding:5px 0;
}
#ygrp-mlmsg #logo{
padding-bottom:10px;}

#ygrp-vital{
background-color:#e0ecee;margin-bottom:20px;padding:2px 0 8px 8px;}
#ygrp-vital #vithd{
font-size:77%;font-family:Verdana;font-weight:bold;color:#333;text-transform:uppercase;}
#ygrp-vital ul{
padding:0;margin:2px 0;}
#ygrp-vital ul li{
list-style-type:none;clear:both;border:1px solid #e0ecee;
}
#ygrp-vital ul li .ct{
font-weight:bold;color:#ff7900;float:right;width:2em;text-align:right;padding-right:.5em;}
#ygrp-vital ul li .cat{
font-weight:bold;}
#ygrp-vital a {
text-decoration:none;}

#ygrp-vital a:hover{
text-decoration:underline;}

#ygrp-sponsor #hd{
color:#999;font-size:77%;}
#ygrp-sponsor #ov{
padding:6px 13px;background-color:#e0ecee;margin-bottom:20px;}
#ygrp-sponsor #ov ul{
padding:0 0 0 8px;margin:0;}
#ygrp-sponsor #ov li{
list-style-type:square;padding:6px 0;font-size:77%;}
#ygrp-sponsor #ov li a{
text

Re: [flexcoders] Repeater Refresh

2007-03-26 Thread Kevin
thanks.  I think the ArrayCollection is the key.  Using addItem  
instead of push makes all the difference.  It now works.


- Kevin


On Mar 24, 2007, at 6:04 PM, Jeffry Houser wrote:



 I've done this with an ArrayCollections, but never with an Array.   
The code would be something like this:


mx:Script
![CDATA[
public var myArray:Array = ['test1','test2','test3'];
public var myArrayCollection = new ArrayCollection(myArray);

public function addItem():void{
myArrayCollection.addItem('test4');
}
]]
/mx:Script
mx:VBox
mx:Repeater id=rp dataProvider={myArrayCollection} 
mx:TextInput id=myRepeat /
/mx:Repeater
mx:Button label=click me click=addItem(); /
/mx:VBox


 A few caveats...
a) I didn't test this code
b) In my situation, I wasn't adding from the same component that  
was displaying things, so the 'add' and 'display were never shown  
at the same time.  There could have been other code that made the  
refresh work, but I don't remember anything explicit.
c) When accessing a repeater element you use currentIndex when it  
is repeating, but repeaterIndex after the fact.  I haven't found a  
simple way to switch between the two of them, but my solution was  
something like this:


try{
return myArrayCollection.getItemAt(loop.currentIndex );
}
catch (e:Error){
return myArrayCollection.getItemAt(loop.repeaterIndex );
}
 I imagine there must be a better way


At 05:35 PM 3/24/2007, you wrote:

here is a little test to illustrate what I am trying to do (except  
it doesn't work.)  I was hoping that updating the dataProvider  
would add another item to the repeater...


mx:Script
![CDATA[
public var myArray:Array = ['test1','test2' ,'test3'];


public function addItem():void{
myArray.push('test4');
}
]]
/mx:Script
mx:VBox
mx:Repeater id=rp dataProvider={ myArray} 
mx:TextInput id=myRepeat /
/mx:Repeater
mx:Button label=click me click=addItem(); /
/mx:VBox




On Mar 24, 2007, at 5:16 PM, Kevin wrote:


I have a repeater (adding TextInput fields) that is bound to an
ArrayCollection on my model. I was hoping that essentially I could
add a row by just pushing a value into my ArrayCollection on the
model. However, this isn't working. I assume I need to also
refresh the repeater, but can't seem to figure out the best way to
do that.

Thanks, Kevin



--
Jeffry Houser, Software Developer, Writer, Songwriter, Recording  
Engineer

AIM: Reboog711  | Phone: 1-203-379-0773
--
My Company:  http://www.dot-com-it.com
My Podcast:  http://www.theflexshow.com
My Blog:  http://www.jeffryhouser.com
Connecticut Macromedia User Group:  http://www.ctmug.com






[flexcoders] Repeater Refresh

2007-03-24 Thread Kevin
I have a repeater (adding TextInput fields) that is bound to an  
ArrayCollection on my model.  I was hoping that essentially I could  
add a row by just pushing a value into my ArrayCollection on the  
model.  However, this isn't working.  I assume I need to also  
refresh the repeater, but can't seem to figure out the best way to  
do that.

Thanks, Kevin


Re: [flexcoders] Repeater Refresh

2007-03-24 Thread Kevin
here is a little test to illustrate what I am trying to do (except it  
doesn't work.)  I was hoping that updating the dataProvider would add  
another item to the repeater...


mx:Script
![CDATA[
public var myArray:Array = ['test1','test2','test3'];

public function addItem():void{
myArray.push('test4');
}
]]
/mx:Script
mx:VBox
mx:Repeater id=rp dataProvider={myArray} 
mx:TextInput id=myRepeat /
/mx:Repeater
mx:Button label=click me click=addItem(); /
/mx:VBox




On Mar 24, 2007, at 5:16 PM, Kevin wrote:


I have a repeater (adding TextInput fields) that is bound to an
ArrayCollection on my model. I was hoping that essentially I could
add a row by just pushing a value into my ArrayCollection on the
model. However, this isn't working. I assume I need to also
refresh the repeater, but can't seem to figure out the best way to
do that.

Thanks, Kevin






Re: [flexcoders] Repeater Refresh

2007-03-24 Thread Jeffry Houser


 I've done this with an ArrayCollections, but never with an 
Array.  The code would be something like this:


mx:Script
![CDATA[
public var myArray:Array = ['test1','test2','test3'];
public var myArrayCollection = new ArrayCollection(myArray);

public function addItem():void{
myArrayCollection.addItem('test4');
}
]]
/mx:Script
mx:VBox
mx:Repeater id=rp dataProvider={myArrayCollection} 
mx:TextInput id=myRepeat /
/mx:Repeater
mx:Button label=click me click=addItem(); /
/mx:VBox


 A few caveats...
a) I didn't test this code
b) In my situation, I wasn't adding from the same component that was 
displaying things, so the 'add' and 'display were never shown at the 
same time.  There could have been other code that made the refresh 
work, but I don't remember anything explicit.
c) When accessing a repeater element you use currentIndex when it is 
repeating, but repeaterIndex after the fact.  I haven't found a 
simple way to switch between the two of them, but my solution was 
something like this:


try{
return myArrayCollection.getItemAt(loop.currentIndex );
}
catch (e:Error){
return myArrayCollection.getItemAt(loop.repeaterIndex );
}
 I imagine there must be a better way


At 05:35 PM 3/24/2007, you wrote:

here is a little test to illustrate what I am trying to do (except 
it doesn't work.)  I was hoping that updating the dataProvider would 
add another item to the repeater...


mx:Script
![CDATA[
public var myArray:Array = ['test1','test2','test3'];


public function addItem():void{
myArray.push('test4');
}
]]
/mx:Script
mx:VBox
mx:Repeater id=rp dataProvider={myArray} 
mx:TextInput id=myRepeat /
/mx:Repeater
mx:Button label=click me click=addItem(); /
/mx:VBox




On Mar 24, 2007, at 5:16 PM, Kevin wrote:


I have a repeater (adding TextInput fields) that is bound to an
ArrayCollection on my model. I was hoping that essentially I could
add a row by just pushing a value into my ArrayCollection on the
model. However, this isn't working. I assume I need to also
refresh the repeater, but can't seem to figure out the best way to
do that.

Thanks, Kevin





--
Jeffry Houser, Software Developer, Writer, Songwriter, Recording Engineer
AIM: Reboog711  | Phone: 1-203-379-0773
--
My Company: http://www.dot-com-it.com
My Podcast: http://www.theflexshow.com
My Blog: http://www.jeffryhouser.com
Connecticut Macromedia User Group: http://www.ctmug.com


Re: [flexcoders] Repeater Refresh

2007-03-24 Thread Douglas Knudsen

ArrayCollection is the path to enlightenment, yes, but a metaphysical nudge
along this path is binadability

[Bindable]
public var myArrayCollection = new ArrayCollection(myArray);

DK

On 3/24/07, Jeffry Houser [EMAIL PROTECTED] wrote:



 I've done this with an ArrayCollections, but never with an Array.  The
code would be something like this:

mx:Script
![CDATA[
public var myArray:Array = ['test1','test2','test3'];
public var myArrayCollection = new ArrayCollection(myArray);

public function addItem():void{
myArrayCollection.addItem('test4');
}
]]
/mx:Script
mx:VBox
mx:Repeater id=rp dataProvider={myArrayCollection} 
mx:TextInput id=myRepeat /
/mx:Repeater
mx:Button label=click me click=addItem(); /
/mx:VBox


 A few caveats...
a) I didn't test this code
b) In my situation, I wasn't adding from the same component that was
displaying things, so the 'add' and 'display were never shown at the same
time.  There could have been other code that made the refresh work, but I
don't remember anything explicit.
c) When accessing a repeater element you use currentIndex when it is
repeating, but repeaterIndex after the fact.  I haven't found a simple way
to switch between the two of them, but my solution was something like this:

try{
return myArrayCollection.getItemAt(loop.currentIndex );
}
catch (e:Error){
return myArrayCollection.getItemAt(loop.repeaterIndex );
}
 I imagine there must be a better way


At 05:35 PM 3/24/2007, you wrote:

here is a little test to illustrate what I am trying to do (except it
doesn't work.)  I was hoping that updating the dataProvider would add
another item to the repeater...

mx:Script
![CDATA[
public var myArray:Array = ['test1','test2' ,'test3'];


public function addItem():void{
myArray.push('test4');
}
]]
/mx:Script
mx:VBox
mx:Repeater id=rp dataProvider={ myArray} 
mx:TextInput id=myRepeat /
/mx:Repeater
mx:Button label=click me click=addItem(); /
/mx:VBox




On Mar 24, 2007, at 5:16 PM, Kevin wrote:

I have a repeater (adding TextInput fields) that is bound to an
ArrayCollection on my model. I was hoping that essentially I could
add a row by just pushing a value into my ArrayCollection on the
model. However, this isn't working. I assume I need to also
refresh the repeater, but can't seem to figure out the best way to
do that.

Thanks, Kevin


 --
Jeffry Houser, Software Developer, Writer, Songwriter, Recording Engineer
AIM: Reboog711  | Phone: 1-203-379-0773
--
My Company:  http://www.dot-com-it.com
My Podcast:  http://www.theflexshow.com
My Blog:  http://www.jeffryhouser.com
Connecticut Macromedia User Group:  http://www.ctmug.com







--
Douglas Knudsen
http://www.cubicleman.com
this is my signature, like it?


Re: [flexcoders] Repeater Refresh

2007-03-24 Thread Jeffry Houser


 Right you are! IF I had tested it, I would have caught that error.  ;)

At 09:48 PM 3/24/2007, you wrote:

ArrayCollection is the path to enlightenment, yes, but a 
metaphysical nudge along this path is binadability


[Bindable]
public var myArrayCollection = new ArrayCollection(myArray);

DK

On 3/24/07, Jeffry Houser 
mailto:[EMAIL PROTECTED][EMAIL PROTECTED]  wrote:



 I've done this with an ArrayCollections, but never with an 
Array.  The code would be something like this:


mx:Script
![CDATA[
public var myArray:Array = ['test1','test2','test3'];
public var myArrayCollection = new ArrayCollection(myArray);

public function addItem():void{
myArrayCollection.addItem('test4');
}
]]
/mx:Script
mx:VBox
mx:Repeater id=rp dataProvider={myArrayCollection} 
mx:TextInput id=myRepeat /
/mx:Repeater
mx:Button label=click me click=addItem(); /
/mx:VBox


 A few caveats...
a) I didn't test this code
b) In my situation, I wasn't adding from the same component that was 
displaying things, so the 'add' and 'display were never shown at the 
same time.  There could have been other code that made the refresh 
work, but I don't remember anything explicit.
c) When accessing a repeater element you use currentIndex when it is 
repeating, but repeaterIndex after the fact.  I haven't found a 
simple way to switch between the two of them, but my solution was 
something like this:


try{
return myArrayCollection.getItemAt(loop.currentIndex );
}
catch (e:Error){
return myArrayCollection.getItemAt(loop.repeaterIndex );
}
 I imagine there must be a better way


At 05:35 PM 3/24/2007, you wrote:

here is a little test to illustrate what I am trying to do (except 
it doesn't work.)  I was hoping that updating the dataProvider 
would add another item to the repeater...


mx:Script
![CDATA[
public var myArray:Array = ['test1','test2' ,'test3'];


public function addItem():void{
myArray.push('test4');
}
]]
/mx:Script
mx:VBox
mx:Repeater id=rp dataProvider={ myArray} 
mx:TextInput id=myRepeat /
/mx:Repeater
mx:Button label=click me click=addItem(); /
/mx:VBox




On Mar 24, 2007, at 5:16 PM, Kevin wrote:


I have a repeater (adding TextInput fields) that is bound to an
ArrayCollection on my model. I was hoping that essentially I could
add a row by just pushing a value into my ArrayCollection on the
model. However, this isn't working. I assume I need to also
refresh the repeater, but can't seem to figure out the best way to
do that.

Thanks, Kevin

--
Jeffry Houser, Software Developer, Writer, Songwriter, Recording Engineer
AIM: Reboog711  | Phone: 1-203-379-0773
--
My Company:  http://www.dot-com-it.com
My Podcast:  http://www.theflexshow.com
My Blog:  http://www.jeffryhouser.com
Connecticut Macromedia User Group:  http://www.ctmug.com




--
Douglas Knudsen
http://www.cubicleman.comhttp://www.cubicleman.com
this is my signature, like it?



--
Jeffry Houser, Software Developer, Writer, Songwriter, Recording Engineer
AIM: Reboog711  | Phone: 1-203-379-0773
--
My Company: http://www.dot-com-it.com
My Podcast: http://www.theflexshow.com
My Blog: http://www.jeffryhouser.com
Connecticut Macromedia User Group: http://www.ctmug.com


Re: [flexcoders] Repeater Refresh

2007-03-24 Thread Tim Walling

You need to use something like ArrayCollection which dispatches events. Your
repeater should then pick up the changes and add the new item.


Tim


On 3/24/07, Jeffry Houser [EMAIL PROTECTED] wrote:



 I've done this with an ArrayCollections, but never with an Array.  The
code would be something like this:

mx:Script
![CDATA[
public var myArray:Array = ['test1','test2','test3'];
public var myArrayCollection = new ArrayCollection(myArray);

public function addItem():void{
myArrayCollection.addItem('test4');
}
]]
/mx:Script
mx:VBox
mx:Repeater id=rp dataProvider={myArrayCollection} 
mx:TextInput id=myRepeat /
/mx:Repeater
mx:Button label=click me click=addItem(); /
/mx:VBox


 A few caveats...
a) I didn't test this code
b) In my situation, I wasn't adding from the same component that was
displaying things, so the 'add' and 'display were never shown at the same
time.  There could have been other code that made the refresh work, but I
don't remember anything explicit.
c) When accessing a repeater element you use currentIndex when it is
repeating, but repeaterIndex after the fact.  I haven't found a simple way
to switch between the two of them, but my solution was something like this:

try{
return myArrayCollection.getItemAt(loop.currentIndex );
}
catch (e:Error){
return myArrayCollection.getItemAt(loop.repeaterIndex );
}
 I imagine there must be a better way


At 05:35 PM 3/24/2007, you wrote:

here is a little test to illustrate what I am trying to do (except it
doesn't work.)  I was hoping that updating the dataProvider would add
another item to the repeater...

mx:Script
![CDATA[
public var myArray:Array = ['test1','test2' ,'test3'];


public function addItem():void{
myArray.push('test4');
}
]]
/mx:Script
mx:VBox
mx:Repeater id=rp dataProvider={ myArray} 
mx:TextInput id=myRepeat /
/mx:Repeater
mx:Button label=click me click=addItem(); /
/mx:VBox




On Mar 24, 2007, at 5:16 PM, Kevin wrote:

I have a repeater (adding TextInput fields) that is bound to an
ArrayCollection on my model. I was hoping that essentially I could
add a row by just pushing a value into my ArrayCollection on the
model. However, this isn't working. I assume I need to also
refresh the repeater, but can't seem to figure out the best way to
do that.

Thanks, Kevin


 --
Jeffry Houser, Software Developer, Writer, Songwriter, Recording Engineer
AIM: Reboog711  | Phone: 1-203-379-0773
--
My Company:  http://www.dot-com-it.com
My Podcast:  http://www.theflexshow.com
My Blog:  http://www.jeffryhouser.com
Connecticut Macromedia User Group:  http://www.ctmug.com







--
Tim
timwalling.com