should all be based on property change events, the heart of binding

On Thu, Aug 14, 2008 at 8:55 AM, Richard Rodseth <[EMAIL PROTECTED]> wrote:

>   Oh, I just stepped through Observe, and I guess the standard binding
> mechanism calls the source setter again, which calls the handler.
>
>
> On Thu, Aug 14, 2008 at 6:49 AM, Richard Rodseth <[EMAIL PROTECTED]>wrote:
>
>> Thanks guys.
>>
>> Can someone explain how ac:Observe (which this is based on) works? i.e.
>> what triggers the handler call when somethng in the middle of the source
>> binding expression changes (eg. "b" in "{a.b.c.myCollection}"? I don't see
>> any event handlers, and there's a mysterious execute() method in the parent
>> class (Observer).
>>
>>  And would your version below also fire when b changes?
>>
>> Otherwise, Josh's example works too, but the collection event is the only
>> trigger.
>>
>>
>> On Thu, Aug 14, 2008 at 12:12 AM, Dennis van Nooij <[EMAIL PROTECTED]>wrote:
>>
>>>   try this:
>>>
>>> package com.adobe.ac
>>> {
>>> import mx.events.CollectionEvent;
>>> import mx.collections.ArrayCollection;
>>> import flash.events.Event;
>>> import mx.core.Application;
>>> import mx.core.UIComponent;
>>>
>>>
>>> /**
>>> *
>>> * monitors Collections and react on reassining of the variable
>>> * and changes in the collection which are bindable
>>> *
>>> */
>>> public class ObserveCollection extends Observer
>>> {
>>> private var _handler : Function;
>>> private var _source : Object;
>>>
>>> override public function get handler() : Function
>>> {
>>> return _handler;
>>> }
>>>
>>> public function set handler( value : Function ) : void
>>> {
>>> _handler = value;
>>> if( value != null )
>>> {
>>> isHandlerInitialized = true;
>>> if( isHandlerInitialized && isSourceInitialized )
>>> {
>>> callHandler();
>>> }
>>> }
>>> }
>>>
>>> override public function get source() : Object
>>> {
>>> return _source;
>>> }
>>>
>>> public function set source( value : Object ) : void
>>> {
>>> if (_source != null){
>>>
>>>
>>> _source.removeEventListener(CollectionEvent.COLLECTION_CHANGE,collectionChangeHandler);
>>>
>>> }
>>> _source = value;
>>>
>>>
>>> _source.addEventListener(CollectionEvent.COLLECTION_CHANGE,collectionChangeHandler);
>>>
>>> isSourceInitialized = true;
>>>
>>> if( isHandlerInitialized && isSourceInitialized )
>>> {
>>> callHandler();
>>> }
>>> }
>>>
>>> protected override function callHandler() : void
>>> {
>>> try
>>> {
>>> handler.call( null, source );
>>> }
>>> catch( e : Error )
>>> {
>>> delay( e );
>>> }
>>> }
>>>
>>> protected override function delay( e : Error ) : void
>>> {
>>> UIComponent( Application.application ).callLater( throwException, [
>>> e ] );
>>> }
>>>
>>> private function throwException( e : Error ) : void
>>> {
>>> throw e;
>>> }
>>>
>>> private function collectionChangeHandler (event:Event) : void
>>> {
>>>
>>> callHandler();
>>> }
>>>
>>>
>>> }
>>> }
>>>
>>> cheers,
>>> Dennis
>>>
>>>
>>> --- In flexcoders@yahoogroups.com <flexcoders%40yahoogroups.com>, "Alex
>>> Harui" <[EMAIL PROTECTED]> wrote:
>>> >
>>> > Never used Observe, but if it implements IMXMLObject or you subclass
>>> and
>>> > do so, then you can use it in MXML
>>> >
>>> >
>>> >
>>> > ________________________________
>>> >
>>> > From: flexcoders@yahoogroups.com <flexcoders%40yahoogroups.com>[mailto:
>>> flexcoders@yahoogroups.com <flexcoders%40yahoogroups.com>] On
>>> > Behalf Of Richard Rodseth
>>> > Sent: Wednesday, August 13, 2008 4:16 PM
>>> > To: flexcoders@yahoogroups.com <flexcoders%40yahoogroups.com>
>>> > Subject: [flexcoders] Observing collections
>>> >
>>> >
>>> >
>>> > For some reason I have an aversion to adding event listeners in
>>> > ActionScript, favouring binding expressions and the Observe tag from
>>> > Adobe Consulting. Not sure how rational this is, but there you have it.
>>> > Binding is just so damn elegant.
>>> >
>>> > However, collections are a problem. It seems that so often you want to
>>> > update something if either the collection itself or its contents
>>> > changes, and you don't really care about the details of the change.
>>> >
>>> > I suppose if you're a DataGrid watching its dataprovider you do care
>>> and
>>> > can minimize updates, but in many of the use cases I've encountered,
>>> > that's not the case - my observer is going to do something with the
>>> > whole collection (or maybe I've just been lazy about exploiting
>>> possible
>>> > optimizations).
>>> >
>>> > Is there anything like the Observe tag that can be instantiated in MXML
>>> > and can trigger a function call on a COLLECTION_CHANGE event?
>>> >
>>>
>>>
>>
>  
>

Reply via email to