Thanks for your answer Paul. Obviously, I learned as well. :) -TH
--- In [email protected], "Tom Bray" <[EMAIL PROTECTED]> wrote: > > Hi Paul, > > That's exactly what I was looking for. Thanks for taking the time to supply > the sample app! I'm giddy! > > -Tom > > > On 6/10/06, Paul Williams <[EMAIL PROTECTED]> wrote: > > > > Hi Tom, > > > > A nice way to do this is to create a master that is an ArrayCollection, > > and then for each of your filtered lists you use a ListCollectionView. When > > you create your ListCollectionView you pass your master list in as a > > constructor parameter (because ArrayCollection implements Ilist). You can > > then add a filter function to each of your filtered lists without affecting > > the master. Each ListCollectionView will listen to the underlying IList for > > changes, so these should come through immediately (if they get past the > > filter!). > > > > There's a very simple demo for beta 3 below. Does this solve your problem? > > > > Paul > > > > <?xml version="1.0" encoding="utf-8"?> > > <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" > > layout="horizontal" creationComplete="initialise()"> > > > > > > <mx:Script> > > <![CDATA[ > > import mx.collections.ArrayCollection; > > import flash.utils.Timer; > > > > [Bindable] > > public var master : ArrayCollection = new ArrayCollection(); > > > > [Bindable] > > public var slave1 : ListCollectionView = new ListCollectionView (master); > > [Bindable] > > public var slave2 : ListCollectionView = new ListCollectionView (master); > > [Bindable] > > public var slave3 : ListCollectionView = new ListCollectionView (master); > > > > public var value : int = 0; > > > > public function initialise() : void > > { > > slave1.filterFunction = filterOdd; > > slave1.refresh(); > > slave2.filterFunction = filterEven; > > slave2.refresh(); > > slave3.filterFunction = filterDivBy5; > > slave3.refresh(); > > > > var timer : Timer = new Timer( 200, 50); > > timer.addEventListener( "timer", addValue); > > timer.start(); > > } > > > > public function addValue( event : Event ) : void > > { > > master.addItem( ++value ); > > } > > > > public function filterOdd( item : Object ) : Boolean > > { > > var value : int = int(item); > > return value % 2 == 1 > > } > > > > public function filterEven( item : Object ) : Boolean > > { > > var value : int = int(item); > > return value % 2 == 0 > > } > > > > public function filterDivBy5( item : Object ) : Boolean > > { > > var value : int = int(item); > > return value % 5 == 0 > > } > > > > ]]> > > </mx:Script> > > > > <mx:VBox> > > <mx:Label text="Master List"/> > > <mx:List dataProvider="{ master }" height="400"/> > > </mx:VBox> > > > > <mx:VBox> > > <mx:Label id="slave1Label" text="Odd"/> > > <mx:List dataProvider="{ slave1 }" height="400"/> > > </mx:VBox> > > > > <mx:VBox> > > <mx:Label id="slave2Label" text="Even"/> > > <mx:List dataProvider="{ slave2 }" height="400"/> > > </mx:VBox> > > > > <mx:VBox> > > <mx:Label id="slave3Label" text="Divisible by 5"/> > > <mx:List dataProvider="{ slave3 }" height="400"/> > > </mx:VBox> > > > > </mx:Application> > > > > ________________________________________ > > From: [email protected] <flexcoders%40yahoogroups.com> [mailto: > > [email protected] <flexcoders%40yahoogroups.com>] On Behalf Of > > Jeremy Lu > > Sent: Saturday, June 10, 2006 4:13 AM > > To: [email protected] <flexcoders%40yahoogroups.com> > > Subject: Re: [flexcoders] Re: need strategy for filtering ArrayCollections > > in a Cairngorm app > > > > > > very interesting... > > > > why not trigger a global "ArrayChangedEvent" so each fitlered > > ArrayCollection can update itself according to it ? (with some binding > > settings this should be feasible) > > > > the trigger point is: when new data are pushed into MasterArray, dispatch > > it. > > > > Tom: if you have some sample code, I can give it a try. > > > > On 6/10/06, Tim Hoff <[EMAIL PROTECTED] <TimHoff%40aol.com>> wrote: > > I'll have to take your word on that, but I'm still skeptical. If what you > > say is true, then you could still use the same approach, but instead have > > the view listen for updates to the masterArray in the ModelLocator. You > > could do this either by using the changWatcher utility or Paul Williams' > > Observe tag: > > http://weblogs.macromedia.com/paulw/ > > When your view hears a change to the masterArray, you would then refresh > > the ArrayCollection. It's a little cumbersome, but since direct binding > > doesn't want to work for you, it might be a necessary step. > > -TH > > > > --- In [email protected] <flexcoders% 40yahoogroups.com>, "Tom > > Bray" <tombray@> wrote: > > > > > > Thanks for trying. An ArrayCollection will not reflect changes made > > > directly to its source array, so new items pushed onto masterArray do > > not > > > show up in my views. > > > > > > -Tom > > > > > > On 6/9/06, Tim Hoff TimHoff@ wrote: > > > > > > > > Changes to the masterArray in the ModelLocator should be > > > > automatically reflected in the AC if you use either of the binding > > > > methods I posted. If not, sorry. That's all I have. > > > > > > > > > > > > -TH > > > > > > > > --- In [email protected] <flexcoders% 40yahoogroups.com><flexcoders%40yahoogroups.com>, "Tom > > > > Bray" tombray@ wrote: > > > > > > > > > > The problem is that changes to ModelLocator.getInstance > > > > ().masterArray don't > > > > > update the views' dataProviders. In other words, the > > > > ArrayCollections that > > > > > use masterArray as their source don't know when new items are > > > > added to or > > > > > removed from masterArray. That's why I was thinking that > > > > masterArray would > > > > > actually be masterArrayCollection and I'd bind each of the view's > > > > > dataProvider ACs to it so they could stay in sync. I bound the > > > > master AC to > > > > > the sub ACs using BindingUtils and was surprised to see the filter > > > > function > > > > > on the sub ACs affect the master AC. I posted sample code here: > > > > > http://groups.yahoo.com/group/flexcoders/message/39064?l=1 > > > > > > > > > > Thanks again! > > > > > > > > > > -Tom > > > > > > > > > > On 6/9/06, Tim Hoff TimHoff@ wrote: > > > > > > > > > > > > > > > > > > Something like this should do the trick: > > > > > > > > > > > > <mx:Script> > > > > > > <![CDATA[ > > > > > > > > > > > > import mx.collections.ArrayCollection; > > > > > > import org.ets.main.code.model.ModelLocator; > > > > > > > > > > > > [Bindable] > > > > > > public var viewDataProvider : ArrayCollection; > > > > > > viewDataProvider=new > > > > > > ArrayCollection({ModelLocator.getInstance ().masterArray}); > > > > > > > > > > > > ]]> > > > > > > </mx:Script> > > > > > > > > > > > > -TH > > > > > > > > > > > > > > > > > > > > --- In [email protected] <flexcoders% 40yahoogroups.com><flexcoders%40yahoogroups.com><flexcoders% > > > > > > 40yahoogroups.com>, "Tom > > > > > > Bray" <tombray@> wrote: > > > > > > > > > > > > > > Thanks, Tim. That makes sense but there's one limitation I'm > > > > not sure > > > > > > how > > > > > > > to work around. That master Array of users is going to be > > > > constantly > > > > > > updated > > > > > > > by the server to show who's currenlty online. Since an Array > > > > isn't > > > > > > > bindable, how would you propagate changes from that Array to > > > > the > > > > > > filtered > > > > > > > ArrayCollections that use it as their source? > > > > > > > > > > > > > > -Tom > > > > > > > > > > > > > > On 6/9/06, Tim Hoff TimHoff@ wrote: > > > > > > > > > > > > > > > > Hey Tom, > > > > > > > > > > > > > > > > In response to this question and the BindingUtils and > > > > > > > > ArrayCollection.filter question, I offer this suggestion. In > > > > the > > > > > > > > ModelLocator maintain a single master Array of all the > > > > users. Then > > > > > > > > in each instance of your view components, create a new bound > > > > > > > > ArrayCollection (dataProvider), with the master Array as the > > > > > > > > underlying source. Each of the ArrayCollections will have a > > > > > > > > different filterFunction based on the type of view component > > > > that is > > > > > > > > instantiated. Because the ArrayCollections don't actually > > > > contain > > > > > > > > any data, just pointers to the underlying Array, I would > > > > handle the > > > > > > > > ArrayCollections and filterFunctions in viewHelpers. In a > > > > sense, > > > > > > > > you would be creating separate sub-sets of the master Array > > > > in each > > > > > > > > instance of your views. If you preferred, you could maintain > > > > each > > > > > > > > ArrayCollection (Array of ArrayCollections) in the > > > > ModelLocator as > > > > > > > > well. > > > > > > > > > > > > > > > > I hope that this makes sense, > > > > > > > > Tim Hoff > > > > > > > > > > > > > > > > > > > > > > > > --- In [email protected]<flexcoders% 40yahoogroups.com><flexcoders%40yahoogroups.com><flexcoders% > > > > 40yahoogroups.com ><flexcoders%40yahoogroups.com>, > > > > > > > > > > > > > > > > "Tom > > > > > > > > Bray" tombray@ wrote: > > > > > > > > > > > > > > > > > > Say my model has an ArrayCollection of all the users that > > > > are > > > > > > > > > connected to my Flex app. I then have configurable list > > > > views that > > > > > > > > > display different subsets of that collection based on > > > > different > > > > > > > > user > > > > > > > > > properties (gender, age, location, etc.). Multiple views, > > > > multiple > > > > > > > > > filters, all being fed from the same master > > > > ArrayCollection of all > > > > > > > > > connected users. I even want the user to be able to > > > > dynamically > > > > > > > > > create new views with different filters. > > > > > > > > > > > > > > > > > > Unless there's something I'm missing, each view is going > > > > to need > > > > > > > > its > > > > > > > > > very own ArrayCollection that has its own filter function > > > > set up. > > > > > > > > I'm > > > > > > > > > picturing a wrapper class that provides addFilter () and > > > > > > > > removeFilter() > > > > > > > > > methods so that the AC's filter function can traverse an > > > > array of > > > > > > > > > other filters -- kind of a CompoundCommand pattern. > > > > > > > > > > > > > > > > > > Assuming that's part of the correct approach, I want my > > > > master AC > > > > > > > > to > > > > > > > > > pump changes out to the filtering ACs which pump changes > > > > out to > > > > > > the > > > > > > > > > views. Is there a way to make the binding mechanism work > > > > for this? > > > > > > > > > Is there a simpler approach I'm overlooking? > > > > > > > > > > > > > > > > > > Any tips you can send my way would be greatly appreciated. > > > > > > > > > > > > > > > > > > Thanks, > > > > > > > > > > > > > > > > > > Tom > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ------------------------ Yahoo! Groups Sponsor --------------------~--> Everything you need is one click away. Make Yahoo! your home page now. http://us.click.yahoo.com/AHchtC/4FxNAA/yQLSAA/nhFolB/TM --------------------------------------------------------------------~-> -- Flexcoders Mailing List FAQ: http://groups.yahoo.com/group/flexcoders/files/flexcodersFAQ.txt Search Archives: http://www.mail-archive.com/flexcoders%40yahoogroups.com Yahoo! Groups Links <*> To visit your group on the web, go to: http://groups.yahoo.com/group/flexcoders/ <*> To unsubscribe from this group, send an email to: [EMAIL PROTECTED] <*> Your use of Yahoo! Groups is subject to: http://docs.yahoo.com/info/terms/

