AS3イベントは、ディスプレイリストに関連しないオブジェクトにイベントを派遣します
-
20-09-2019 - |
質問
したがって、イベントはディスプレイリストをバブルアップします。それがあなたが望むものであるなら、それは素晴らしいことです。しかし、ステージ上に関連していないオブジェクトがあり、お互いからイベントを聞く必要がある場合はどうでしょうか。簡素化された例:
var objA = new ObjA;
addChild(objA);
var objB = new ObjB;
addChild(objB);
var objC = new ObjC;
objB.addChild(objC);
オブジェクトBは、オブジェクトCによって発送されたイベントをリッスンできますが、オブジェクトCによって発送されたイベントをリッスンするためにオブジェクトAも必要です。これらのオブジェクトは異なるクラスで作成されるため、相互にコードを参照することはできません。解決?
解決
解決策:イベントが適切に泡立っている場合、拡張されるクラスからステージにリスナーを設定できるはずです DisplayObject
ディスプレイチェーンにあります。
キャッチ:標準的なイベントを聞いているだけの場合、特定のイベントが1つの「場所」からしか来ないことを知っていない限り、彼らがどこから来ているのかを実際に伝えることはできません。
修正:このような場合、カスタムイベントを派遣するのが最善です。
拡張される任意のクラス内 DisplayObject
stage.addEventListener(MyAwesomeEvent.SOMETHING_SUPER_SWEET, sweetHandler)
他のヒント
AddEventListener()の最後のパラメーターを使用する場合、リスナーを削除する必要はありません。 真実これは、リスナーが弱い参照を使用するため、GCがリスナーの所有者を収集することを妨げないことを意味します。
おそらく、シングルトンを作ることができます 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);
...
}
所属していません StackOverflow