Actionscript 3 使用事件更新多个视图中的一个
我不完全理解actionscript中的事件机制,所以如果有问题,请原谅。假设我们有一个Actionscript 3 使用事件更新多个视图中的一个,actionscript-3,flash,events,Actionscript 3,Flash,Events,我不完全理解actionscript中的事件机制,所以如果有问题,请原谅。假设我们有一个控制器(扩展EventDispatcher)和几个视图,请注意视图可以是各种类的实例。请确保每个视图都侦听自定义事件。某些内容已更改。问题是,如果我在Controller中执行dispatchEvent(new CustomEvent(CustomEvent.SOMETHING_CHANGED)),事件会出现在每个侦听器中,还是会被第一个视图捕获,并且不会进一步 提前谢谢你 是,它将传递给所有侦听器,直到其中
控制器
(扩展EventDispatcher
)和几个视图,请注意视图可以是各种类的实例。请确保每个视图都侦听自定义事件。某些内容已更改。问题是,如果我在Controller
中执行dispatchEvent(new CustomEvent(CustomEvent.SOMETHING_CHANGED))
,事件会出现在每个侦听器中,还是会被第一个视图捕获,并且不会进一步
提前谢谢你 是,它将传递给所有侦听器,直到其中一个调用事件对象的stopImmediatePropagation方法为止(这将仅在事件可取消时停止该事件)是,它将传递给所有侦听器,直到其中一个调用事件对象的stopImmediatePropagation方法为止(这将仅在事件可取消时停止事件)对于任何对象观察另一个对象发送的事件,有几个条件:
dispatchEvent(new Event(TYPE_NAME, 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"
}
}
}
我很高兴能对这个问题有更多的了解。对于任何物体观察到另一个物体发出的事件,有几个条件:
dispatchEvent(new Event(TYPE_NAME, 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时。因此,您可以生成事件,这将允许您的系统以最高优先级订阅这些事件-例如,更改逻辑。