Actionscript 3 使用事件更新多个视图中的一个

Actionscript 3 使用事件更新多个视图中的一个,actionscript-3,flash,events,Actionscript 3,Flash,Events,我不完全理解actionscript中的事件机制,所以如果有问题,请原谅。假设我们有一个控制器(扩展EventDispatcher)和几个视图,请注意视图可以是各种类的实例。请确保每个视图都侦听自定义事件。某些内容已更改。问题是,如果我在Controller中执行dispatchEvent(new CustomEvent(CustomEvent.SOMETHING_CHANGED)),事件会出现在每个侦听器中,还是会被第一个视图捕获,并且不会进一步 提前谢谢你 是,它将传递给所有侦听器,直到其中

我不完全理解actionscript中的事件机制,所以如果有问题,请原谅。假设我们有一个
控制器
(扩展
EventDispatcher
)和几个视图,请注意视图可以是各种类的实例。请确保每个视图都侦听自定义事件。某些内容已更改。问题是,如果我在
Controller
中执行
dispatchEvent(new CustomEvent(CustomEvent.SOMETHING_CHANGED))
,事件会出现在每个侦听器中,还是会被第一个视图捕获,并且不会进一步


提前谢谢你

是,它将传递给所有侦听器,直到其中一个调用事件对象的stopImmediatePropagation方法为止(这将仅在事件可取消时停止该事件)

是,它将传递给所有侦听器,直到其中一个调用事件对象的stopImmediatePropagation方法为止(这将仅在事件可取消时停止事件)

对于任何对象观察另一个对象发送的事件,有几个条件:

  • 对象必须是显示对象
  • 分派该事件的对象必须是侦听对象的子对象
  • 如果父对象正在侦听冒泡阶段(默认),则在事件创建期间必须将冒泡设置为true

            dispatchEvent(new Event(TYPE_NAME, true));
    
  • 否则它可能会在捕获阶段被捕获,请添加带有“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"
            }
    
        }
    
    }
    

    我很高兴能对这个问题有更多的了解。

    对于任何物体观察到另一个物体发出的事件,有几个条件:

  • 对象必须是显示对象
  • 分派该事件的对象必须是侦听对象的子对象
  • 如果父对象正在侦听冒泡阶段(默认),则在事件创建期间必须将冒泡设置为true

            dispatchEvent(new Event(TYPE_NAME, true));
    
  • 否则它可能会在捕获阶段被捕获,请添加带有“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"
            }
    
        }
    
    }
    

    我很高兴能对这个问题有更多的了解。

    我认为这个答案不够具体和透彻。在你附近的答案中,你说的只是显示对象树。但是,如果每个类都是从EventDispatcher派生的,或者如果它实现了IEventDispatcher,那么它都可以是EventDispatcher。你错过了“捕获阶段”.所以,你的答案也很具体。这就是为什么我没有展示一个例子-对于一个答案来说,flash api的很大一部分。是的,他问的是视图(显示)对象从另一个对象捕获事件。我的答案显示了可能的情况。从我的示例中可以看出,除非是调度程序的父对象,否则调度的事件不会传递给所有侦听器。我只是认为你的答案不正确。我更改了答案以反映目标阶段。因此,据我所知,他的问题问:什么是EndoDebug循环的原理?因为“系统是否提供它”是语言和系统(java,C++框架等)的主要区别。几年前我有类似的问题,我需要像我一样的答案。嗯……我说。"eventdispatcher可以自己监听,所以不管subsСriber的目标是什么。例如,当listener和dispatcher是同一个对象时:当您创建了某个类,但您希望在不继承的情况下重播其api时。因此,您可以生成事件,这将允许您的系统以最高优先级订阅这些事件-例如,更改逻辑。我认为这个答案不够具体和透彻。在您附近的答案中,您所说的只是显示对象树。但是,如果每个类都是从EventDispatcher派生的,或者如果它实现了IEventDispatcher,那么它都可以是EventDispatcher。而且您错过了“捕获阶段”.所以,你的答案也很具体。这就是为什么我没有展示一个例子-对于一个答案来说,flash api的很大一部分。是的,他问的是视图(显示)对象从另一个对象捕获事件。我的答案显示了可能的情况。从我的示例中可以看出,除非是调度程序的父对象,否则调度的事件不会传递给所有侦听器。我只是认为你的答案不正确。我更改了答案以反映目标阶段。因此,据我所知,他的问题问:什么是EndoDebug循环的原理?因为“系统是否提供它”是语言和系统(java,C++框架等)的主要区别。几年前我有类似的问题,我需要像我一样的答案。嗯……我说。"eventdispatcher可以自己监听,所以不管subsСriber的目标是什么。例如,当listener和dispatcher是同一个对象时:当您创建了某个类,但您希望在不继承的情况下重播其api时。因此,您可以生成事件,这将允许您的系统以最高优先级订阅这些事件-例如,更改逻辑。