[flexcoders] Repeater refresh bug?
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
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
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
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
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
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
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
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
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