0

そのため、イベントによって表示リストが表示されます。それがあなたが望むものなら、それは素晴らしいことです。しかし、ステージ上に関連のないオブジェクトがあり、相互にイベントをリッスンする必要がある場合はどうでしょうか。簡単な例:

var objA = new ObjA;
addChild(objA);

var objB = new ObjB;
addChild(objB);

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

オブジェクトBは、オブジェクトCによってディスパッチされたイベントをリッスンできます。ただし、オブジェクトCによってディスパッチされたイベントをリッスンするには、オブジェクトAも必要です。また、これらのオブジェクトは異なるクラスで作成されるため、相互に参照をハードコーディングできません。解決?

4

3 に答える 3

0

次に、おそらく、シングルトン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 {}

次に、次のようなすべてのクラスで使用できます。

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解決策:イベントが適切にバブリングしている場合は、拡張されてディスプレイチェーン上にある 任意のクラスからステージにリスナーを設定できるはずです。

キャッチ:標準のイベントを聞くだけでは、特定のイベントが1つの「場所」からしか発生しないことがわかっていない限り、それらがどこから発生しているのかを実際に知ることはできません。

修正:このような場合、カスタムイベントをディスパッチするのが最善です。


拡張するクラス内DisplayObject

stage.addEventListener(MyAwesomeEvent.SOMETHING_SUPER_SWEET, sweetHandler)
于 2009-11-18T06:01:06.133 に答える
0

addEventListener()の最後のパラメーターを使用する場合はリスナーを削除する必要はありません。これはtrue に設定する必要があります。これは、リスナーが弱参照を使用することを意味し、GCがリスナーの所有者を収集することを妨げません。

于 2010-03-26T12:53:35.963 に答える