Flash AS3将事件分派到显示列表上不相关的对象
因此,事件会出现在显示列表中。如果这是你想要的,那太好了。但是,如果舞台上有不相关的对象,它们需要相互监听事件,该怎么办?一个简化的例子:Flash AS3将事件分派到显示列表上不相关的对象,flash,actionscript-3,events,event-bubbling,event-listener,Flash,Actionscript 3,Events,Event Bubbling,Event Listener,因此,事件会出现在显示列表中。如果这是你想要的,那太好了。但是,如果舞台上有不相关的对象,它们需要相互监听事件,该怎么办?一个简化的例子: var objA = new ObjA; addChild(objA); var objB = new ObjB; addChild(objB); var objC = new ObjC; objB.addChild(objC); 对象B可以侦听对象C发送的事件。但我还需要对象A侦听对象C发送的事件。而且,这些对象是在不同的类中创建的,所以我不能硬编码
var objA = new ObjA;
addChild(objA);
var objB = new ObjB;
addChild(objB);
var objC = new ObjC;
objB.addChild(objC);
对象B可以侦听对象C发送的事件。但我还需要对象A侦听对象C发送的事件。而且,这些对象是在不同的类中创建的,所以我不能硬编码彼此的引用。解决方案?那么,您可能可以创建一个Singleton EventDispatcher,并在所有类中使用它来调度事件
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 {}
在A班,你可以听它:
public class A {
...
SingletonDispatcher.GetInstance().addEventListener(SomeEvent.UNREACHABLE_EVENT, thankGod);
...
}
解决方案:如果您的事件正确冒泡,那么您应该能够在舞台上从任何扩展DisplayObject并位于显示链上的类设置侦听器 问题:如果你只听标准事件,你就无法真正知道它们来自哪里,除非你知道某个特定事件只能来自一个地方 修正:在这种情况下,最好发送自定义事件 在任何扩展DisplayObject的类中
如果使用addEventListener的最后一个参数,则无需删除侦听器,该参数应设置为true
这意味着您的侦听器将使用弱引用,因此不会阻止GC收集侦听器的所有者。有趣的解决方案。如果我的目标无法进入舞台,我会探索这个。
public class A {
...
SingletonDispatcher.GetInstance().addEventListener(SomeEvent.UNREACHABLE_EVENT, thankGod);
...
}
stage.addEventListener(MyAwesomeEvent.SOMETHING_SUPER_SWEET, sweetHandler)