this is cool, thanks for the great example.



On 6/11/06, Tim Hoff <[EMAIL PROTECTED]> wrote:

Thanks for your answer Paul. Obviously, I learned as well. :)



-TH

--- In flexcoders@yahoogroups.com, "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: flexcoders@yahoogroups.com <flexcoders%40yahoogroups.com>
[mailto:
> > flexcoders@yahoogroups.com <flexcoders%40yahoogroups.com>] On

Behalf Of
> > Jeremy Lu
> > Sent: Saturday, June 10, 2006 4:13 AM
> > To: flexcoders@yahoogroups.com <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 flexcoders@yahoogroups.com <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 flexcoders@yahoogroups.com <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 flexcoders@yahoogroups.com <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 flexcoders@yahoogroups.com<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
> > > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > >
> > > >
> > > >
> > > >
> > >
> >
> >
> >
>


__._,_.___

--
Flexcoders Mailing List
FAQ: http://groups.yahoo.com/group/flexcoders/files/flexcodersFAQ.txt
Search Archives: http://www.mail-archive.com/flexcoders%40yahoogroups.com





SPONSORED LINKS
Web site design development Computer software development Software design and development
Macromedia flex Software development best practice


YAHOO! GROUPS LINKS




__,_._,___

Reply via email to