0

私はアクション スクリプトのイベントのメカニズムを完全には理解していないため、質問がダンプされている場合はご容赦ください。Controller(extends )とEventDispatcherいくつかのビューがあるとします。ビューはさまざまなクラスのインスタンスであることに注意してください。各ビューが listen しているとしますCustomEvent.SOMETHING_CHANGED。問題は、私がそうdispatchEvent(new CustomEvent(CustomEvent.SOMETHING_CHANGED))する場合Controller、イベントが各リスナーに来るか、それとも最初のビューに捕らえられて先に進まないかです。

前もって感謝します!

4

2 に答える 2

2

はい、いずれかのリスナーがイベント オブジェクトの stopImmediatePropagation メソッドを呼び出すまで、すべてのリスナーに渡されます (これは、キャンセル可能な場合にのみイベントを停止します)

于 2012-09-25T14:30:14.003 に答える
1

オブジェクトが別のオブジェクトによって送出されたイベントを監視するには、いくつかの条件があります。

  1. オブジェクトは表示オブジェクトでなければなりません。
  2. そのイベントをディスパッチするオブジェクトは、リッスンしているオブジェクトの子である必要があります。
  3. 親オブジェクトがバブリング フェーズ (デフォルト) をリッスンしている場合、イベントの作成中にバブリングを true に設定する必要があります。

            dispatchEvent(new Event(TYPE_NAME, true));
    
  4. それ以外の場合は、キャプチャ フェーズでキャプチャされる可能性があります。これを実現するには、'useCapture = true でイベント リスナーを追加します。

            addEventListener(TYPE_NAME, onFuncName, true);
    

それ以外の場合、オブジェクトは、ターゲット フェーズでオブジェクト自体によってディスパッチされたイベントのみをキャプチャできます。

コード例を次に示します。

package regression 
{
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.KeyboardEvent;
    import flash.events.MouseEvent;
    import flash.events.EventPhase;
    /**
     * ...
     * @author ...
     */
    public class Check_event_listening_1 extends Sprite
    {
        public  const   EVENT_DANCE     : String    = "dance";
        public  const   EVENT_PLAY      : String    = "play";
        public  const   EVENT_YELL      : String    = "yell";
        private var     baby            : Shape     = new Shape();
        private var     mom             : Sprite    = new Sprite();
        private var     stranger        : EventDispatcher = new EventDispatcher();

        public function Check_event_listening_1() 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void 
        {
            trace("test begun");
            addChild(mom);
            mom.addChild(baby);
            stage.addEventListener(EVENT_YELL, onEvent);
            this.addEventListener(EVENT_YELL, onEvent);
            mom.addEventListener(EVENT_YELL, onEvent);
            baby.addEventListener(EVENT_YELL, onEvent);
            stranger.addEventListener(EVENT_YELL, onEvent);
            trace("\nTest1 - Stranger yells with no bubbling");
            stranger.dispatchEvent(new Event(EVENT_YELL, false));
            trace("\nTest2 - Stranger yells with bubbling");
            stranger.dispatchEvent(new Event(EVENT_YELL, true));

            stage.addEventListener(EVENT_PLAY, onEvent);
            this.addEventListener(EVENT_PLAY, onEvent);
            mom.addEventListener(EVENT_PLAY, onEvent);
            baby.addEventListener(EVENT_PLAY, onEvent);
            stranger.addEventListener(EVENT_PLAY, onEvent);
            trace("\nTest3 - baby plays with no bubbling");
            baby.dispatchEvent(new Event(EVENT_PLAY, false));
            trace("\nTest4 - baby plays with bubbling");
            baby.dispatchEvent(new Event(EVENT_PLAY, true));
            trace("\nTest5 - baby plays with bubbling but is not a child of mom");
            mom.removeChild(baby);
            baby.dispatchEvent(new Event(EVENT_PLAY, true));
            mom.addChild(baby);

            stage.addEventListener(EVENT_DANCE, onEvent, true);
            this.addEventListener(EVENT_DANCE, onEvent, true);
            mom.addEventListener(EVENT_DANCE, onEvent, true);
            baby.addEventListener(EVENT_DANCE, onEvent, true);
            trace("\nTest6 - Mom dances without bubbling - everyone is listening during capture phase(not target and bubble phase)");
            mom.dispatchEvent(new Event(EVENT_DANCE, false));
            trace("\nTest7 - Mom dances with bubbling - everyone is listening during capture phase(not target and bubble phase)");
            mom.dispatchEvent(new Event(EVENT_DANCE, true));
        }

        private function onEvent(e : Event):void
        {
            trace("Event was captured");
            trace("\nTYPE : ", e.type, "\nTARGET : ", objToName(e.target), "\nCURRENT TARGET : ", objToName(e.currentTarget), "\nPHASE : ", phaseToString(e.eventPhase));
        }

        private function phaseToString(phase : int):String
        {
            switch(phase)
            {
                case EventPhase.AT_TARGET :
                    return "TARGET";
                case EventPhase.BUBBLING_PHASE :
                    return "BUBBLING";
                case EventPhase.CAPTURING_PHASE :
                    return "CAPTURE";
                default:
                    return "UNKNOWN";
            }

        }

        private function objToName(obj : Object):String
        {
            if (obj == stage) return "STAGE";
            else if (obj == this) return "MAIN";
            else if (obj == mom) return "Mom";
            else if (obj == baby) return "Baby";
            else if (obj == stranger) return "Stranger";
            else return "Unknown"
        }

    }

}

この件についてもっと光を当てることができれば幸いです。

于 2012-09-25T16:41:54.973 に答える