0

因此,事件会在显示列表中冒泡。如果这就是你想要的,那就太好了。但是,如果舞台上有不相关的对象需要相互监听事件怎么办?一个简化的例子:

var objA = new ObjA;
addChild(objA);

var objB = new ObjB;
addChild(objB);

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

对象 B 可以侦听由对象 C 分派的事件。但我还需要对象 A 来侦听由对象 C 分派的事件。此外,这些对象是在不同的类中创建的,因此我不能对彼此的引用进行硬编码。解决方案?

4

3 回答 3

0

不需要移除你的监听器,如果你使用addEventListener()的最后一个参数,它应该设置为true ,这意味着你的监听器将使用弱引用,因此不会阻止GC收集监听器的所有者。

于 2010-03-26T12:53:35.963 回答
0

然后,您可能可以创建一个 SingletonEventDispatcher并在所有类中使用它来调度事件。

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 {}

然后您可以在所有类中使用,例如:

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

在课堂A上,你可以听:

public class A {
  ...
  SingletonDispatcher.GetInstance().addEventListener(SomeEvent.UNREACHABLE_EVENT, thankGod);
  ...
}
于 2009-11-18T05:56:44.020 回答
0

解决方案:如果您的事件正确冒泡,您应该能够从任何扩展DisplayObject并位于显示链上的类在舞台上设置监听器。

抓到:如果您只收听标准事件,除非您知道特定事件只能来自一个“地方”,否则您将无法真正分辨它们来自哪里。

修复:在这种情况下,最好调度自定义事件。


在任何扩展的类中DisplayObject

stage.addEventListener(MyAwesomeEvent.SOMETHING_SUPER_SWEET, sweetHandler)
于 2009-11-18T06:01:06.133 回答