2

こんにちは、AS3 の非表示リスト クラスでイベント バブリングを利用できるかどうか疑問に思っています。

たとえば、多くの車を含む City クラスがあるアプリケーションのモデルでは。イベント リスナーを City オブジェクトにアタッチし、子の Cars から発生するイベントを受け取るには、どのようなメソッドがありますか。明確にするために、City オブジェクトと Car オブジェクトは表示リストの一部ではなく、DisplayObjects ではありません。では、どうにかして表示リストの外でバブリングを実装することはできますか?

私の知る限り、イベント リスナーを各 Car オブジェクトに手動でアタッチし、City オブジェクトからイベントを再ディスパッチしない限り、これは不可能です。他の誰かがよりクリーンなソリューションを持っていますか?

4

3 に答える 3

2

このクラスは、その問題に対する私の解決策でした。基本的に、BubblingEventDispatcher を拡張する代わりに、通常は EventDispatcher を拡張するクラスを用意します。

次に addChildTarget( target:BubblingEventDispatcher ) 関数を呼び出して、バブルされたイベントをキャッチできる子をセットアップします。

このソリューションでは、イベント ディスパッチャごとにスプライトを使用しますが、クラスごとに 1 バイトの余分なメモリ使用量しか発生しません。

package 
{
 import flash.display.Sprite;
 import flash.events.Event;
 import flash.events.EventDispatcher;

 public class BubblingEventDispatcher extends EventDispatcher
 {
  //We have to use a sprite to take advantage of flash's internal event bubbling system
  private var sprite:Sprite;

  public function BubblingEventDispatcher()
  {
   //initialize our sprite
   sprite = new Sprite();
  }

  public override function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void
  {
   sprite.addEventListener( type, listener, useCapture, priority, useWeakReference );
  }

  public override function dispatchEvent(event:Event):Boolean
  {
   return sprite.dispatchEvent( event );
  }

  //We must add child targets if we want to take advantage of the bubbling
  public function addChildTarget( target:BubblingEventDispatcher ):void
  {
   sprite.addChild( target.eventTarget as Sprite );
  }

  public function get eventTarget():EventDispatcher
  {
   return sprite;
  }
 }
}
于 2010-04-29T22:11:34.423 に答える
1

私が完全に理解しているかどうかはわかりませんが、イベントを作成すると、それが泡立つと言うことができ、ディスパッチされると泡立ちます。

http://livedocs.adobe.com/flex/3/html/help.html?content=createevents_3.html

http://livedocs.adobe.com/flex/3/langref/flash/events/Event.html#Event()

これにより、適切なタイプのイベントのためにイベントリスナーを都市にアタッチでき、車によってスローされたイベントをキャッチできると思います。私はこれを試したことがないので、確信が持てません。

アップデート:

あ、これは気づきませんでした。あなたは正しいです。次のリンクから:

http://livedocs.adobe.com/flex/3/html/help.html?content=events_08.html

Event オブジェクトが表示リスト内のノードからノードに移動すると、キャプチャとバブリングが発生します。キャプチャの場合は親から子へ、バブリングの場合は子から親へ移動します。このプロセスは、継承階層とは関係ありません。DisplayObject オブジェクト (コンテナーやコントロールなどのビジュアル オブジェクト) のみが、ターゲット フェーズに加えてキャプチャ フェーズとバブリング フェーズを持つことができます。

これを回避できる唯一の方法は、新しい子が子として追加されるたびに、子を親 (市のある車) に登録することです。その時点で、親 (city) にイベント リスナーを追加し、イベントが子 (car) から処理されるたびに、親 (city) からイベントを再ディスパッチできます。醜いことはわかっています。子を削除するときはいつでもイベントリスナーを削除するようにしたいと思うでしょうが、それが私が見ることができる唯一の実際の解決策です。

于 2009-03-19T14:00:59.410 に答える
0

これが投稿された年はわかりませんが、これを発見したばかりで、少年は愚かです。バブリングが表示リストに依存するのはなぜですか? AS3 でイベント モデルを構築する際に、アドビはすべてのクラスにバブリングを実装する必要があったように思えます。複数の表示オブジェクトが相互にリッスンする必要がある場合よりも、異なるクラス間でデータを渡す必要がある場合がはるかに多くなります。言うまでもなく、動的インスタンスによって使用される動的インスタンスによって使用される動的インスタンスを参照するよりも、表示リストとルートを使用して表示オブジェクトを参照する方がはるかに簡単です (わかります)。結局、AS2 のイベント モデルは、AS3 のイベント モデルとそれほどかけ離れていません。

于 2009-05-05T21:14:08.580 に答える