イベントがコンポーネントによってディスパッチされる場合、イベントが流れる3つのフェーズがあります。キャプチャ-イベントはアプリケーションからイベントをディスパッチするコンポーネントに流れ、イベントが実際にイベントをディスパッチするターゲットにあるときにターゲットになります。イベントがターゲットからアプリケーションに流れるバブリングフェーズ。アプリケーションに子comp1があり、comp1に子comp2がある状況があります。comp1にイベントをディスパッチするボタンがあり、comp2内でそのイベントをリッスンしたいと思います。理想的には、イベントはApplication-> comp1-> button->comp1->Applicationから流れます。どうすれば目標を達成できますか?
2 に答える
内部comp1
でイベントをディスパッチし、バブルが発生することを確認します。
myButton.addEventListener(MouseEvent.CLICK, handleMyButtonClick);
private function handleMyButtonClick(event:MouseEvent):void {
dispatchEvent(new Event("myCustomEvent", true));
}
comp2
で、次のイベントをリッスンしますstage
。
stage.addEventListener("myCustomEvent", handleMyCustomEvent);
それだけです。イベントがバブルするため、常にある時点で にヒットしstage
ます。そのため、どこからでも聞くことができます。リスナーをアタッチする前に、 のstage
プロパティが設定されていることを確認することを忘れないでください。comp2
注: アプリケーション内のすべてのコンポーネントがこのイベントを認識できることに注意してください。そのため、適切なコンポーネントが適切なイベントを処理するようにしてください。まず、組み込みイベントでこのアプローチを使用することはありません。type
s が組み込みのものと一致しないカスタム イベントのみを使用してください。
あなたが提案していることは、おそらく最善の方法ではありません。おそらく、子供が何をすべきかを理解するのに役立つ何かを親に明示的に行わせることで、これをより適切に処理する必要があります。
これを行う 1 つの方法は、 RobotLegs で見られるようなイベント バスの概念を使用することです。eventBus
child2に IEventDispatcher のタイプで呼び出される public フィールドまたはプロパティを与えるだけです。次に、親にこのプロパティに を入力させることができますthis
。私は通常、そのようなプロパティをゲッター/セッターとして設定して、子がステージから削除されたときにプロパティを null にすることができ、子がリスナーを削除できるようにします。
これにより、これを実現するために正確に必要なものから始めることができますが、別のオブジェクトをリッスンするために必要な状況で child2 を使用していることに気付いた場合は、すぐに使用できます。
2 番目の可能性は、親が呼び出すことができる子のメソッドを公開することです (親は既に子への参照を持っています。ここでは不要なカップリングを導入していません)。イベントをディスパッチする代わりに、単にメソッドを呼び出します。