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/
 


Reply via email to