1

すべてのオブジェクトウィッチがそのクラスにあり、指定されたリスナー関数がそのイベントをキャッチできるクラスでイベント (Action Script 3.0) をディスパッチする方法はありますか? . たとえば、次のような構造があります。

編集 (クラスを更新):

class example extends EventDispatcher {
object1 = {subObject1 = {anotherObject1, anotherObbject2}, subObject2}
object2 = {subObject3}
object3

...
}

そして、それらのいくつかにイベントリスナーが必要です:

anotherObject1.addEventListener(MyEvent.PART3D_CHANGED, function (e: MyEvent){/*do something*/);
anotherObbject2.addEventListener(MyEvent.PART3D_CHANGED, function (e: MyEvent){/*do something*/);
object3.addEventListener(MyEvent.PART3D_CHANGED, function (e: MyEvent){/*do something*/);

編集:次に、このクラス内でディスパッチ イベントが必要であり、すべてのオブジェクト ウィッチがリスナーにイベントを処理させるようにします。

this.dispatchEvent(new MyEvent(MyEvent.PART3D_CHANGED))

おわかりのように、1 つのタイプの Event をディスパッチする必要があり、すべてのオブジェクトでそれを行う必要はありません。

私の研究から、すべてのオブジェクトにイベントをディスパッチする必要があることがわかりましたが、多くのサブオブジェクトがあると、必要なリスナーとすべてのオブジェクトの子をループするための別のオプションを使用してすべてのオブジェクトをディスパッチする必要がある場合、コードが乱雑になります。リスナーが必要な場合に気にせずにリスナーを追加すると、コスト効率が低下します。ps私の英語でごめんなさい:-)

4

1 に答える 1

0

イベントモデルにそのような動作の標準的な方法があるとは思いません: http://livedocs.adobe.com/flex/3/html/help.html?content=events_08.html

キャプチャ フェーズ (バブリングの逆) がありますが、祖先に対してはまだ発生します (順序が異なるだけです)。イベント バブリングの主な動機は、一般的なイベントを渡すのではなく、マウス イベントの特殊な性質をサポートすることでした。何かをクリックすると、ボタンとステージの両方が同時にクリックされます (したがって、どちらもそれを処理する自然な権利を持っています)。

代わりに、子供が親クラスに直接サブスクライブできますか? たとえば、オブジェクトがグローバルなマウスの動きに関心がある場合、次のことを行うことは珍しくありません。

stage.addEventListener(MouseEvent.MOUSE_MOVE, watchMouse);

同様に、あなたの anotherObject ができること:

myBigMainParent.addEventListener(MyEvent.MY_EVENT, anotherObjectLocalHandler);

IMO、それはかなりクリーンです。イベントは特定のポイントで発生しますが、どこからでも誰でもサブスクライブできます。

于 2013-03-19T21:49:22.697 に答える