Question

So, events bubble up the display list. That's great if that's what you want. But what if you have objects on the stage that are not related that need to listen for events from each other? A simplified example:

var objA = new ObjA;
addChild(objA);

var objB = new ObjB;
addChild(objB);

var objC = new ObjC;
objB.addChild(objC);

Object B can listen for events dispatched by object C. But I also need object A to listen for events dispatched by object C. Also, these objects are created in different classes so I can't hard code references to each other. Solution?

Was it helpful?

Solution

solution: If your events are properly bubbling, you should be able to set a listener on the stage from any class that extends DisplayObject and is on a display chain.

catch: If you just listen for the standard events you are not going to really be able to tell where they are coming from unless you know that a particular event can only be coming from one "place".

fix: In cases like this it's best to dispatch custom events.


inside any class that extends DisplayObject

stage.addEventListener(MyAwesomeEvent.SOMETHING_SUPER_SWEET, sweetHandler)

OTHER TIPS

there's no need to remove your listeners, if you use the last parameter of addEventListener(), which should be set to true it means that your listener will use weak reference, and thus will not prevent GC from collecting the owner of the listener.

Then probably, you can make a Singleton EventDispatcher and use it in all classes to dispatch the event.

package <WHATEVER>
{
  import flash.events.*;
  public class SingletonDispatcher extends EventDispatcher {
    private static var dispatcher:SingletonDispatcher = null;
    public function SingletonDispatcher (enforcer:SingletonEnforcer) : void {
      if (!enforcer) {
       throw new Error("Direct instatiation is not allowed");
      }
      return;
    }// end function
    public static function GetInstance() : SingletonDispatcher {
      if (!dispatcher) {
        dispatcher= new SingletonDispatcher (new SingletonEnforcer());
      }// end if
      return dispatcher;
    }// end function
  }
}
class SingletonEnforcer {}

Then you can use in the all classes like:

public class C {
...
SingletonDispatcher.GetInstance().dispatchEvent(new SomeEvent()); // instead of this.dispatchEvent
...
}

And in class A, you can listen to it:

public class A {
  ...
  SingletonDispatcher.GetInstance().addEventListener(SomeEvent.UNREACHABLE_EVENT, thankGod);
  ...
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top