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)