AS3 dispatch events to objects not related on the display list
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 event开发者_如何学Gos 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?
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)
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);
...
}
精彩评论