flashas3事件调度

flashas3事件调度,flash,actionscript-3,delegation,Flash,Actionscript 3,Delegation,我对Flash非常陌生,我遇到了一些问题: 所以我的类Main导入了一个类NavMenu。在中,有一个单击项的事件,该事件运行一个函数,我在其中写入: dispatchEvent(new Event('my_event')); 在我的主类中,在我声明的构造函数中 addEventListener('my_event', my_event_handler); 我有EventHandler,我想从舞台上移除一些孩子: private function my_event_handler(event

我对Flash非常陌生,我遇到了一些问题:

所以我的类Main导入了一个类NavMenu。在中,有一个单击项的事件,该事件运行一个函数,我在其中写入:

dispatchEvent(new Event('my_event'));
在我的主类中,在我声明的构造函数中

addEventListener('my_event', my_event_handler);
我有EventHandler,我想从舞台上移除一些孩子:

private function my_event_handler(event:Event):void
{
     trace("my Event");
}
什么也没发生,有人能告诉我我做错了什么吗


谢谢

试着把这个活动带到主课堂上来

dispatchEvent(new Event('my_event', true)); // "true" sets bubbling to true
在addEventListener中,让听众站在主舞台上:

stage.addEventListener('my_event', my_event_handler);

试着把事件引上主课堂

dispatchEvent(new Event('my_event', true)); // "true" sets bubbling to true
在addEventListener中,让听众站在主舞台上:

stage.addEventListener('my_event', my_event_handler);

您需要将侦听器分配给正在调度它的对象。从您的代码中,不清楚是什么在做什么-但是,例如,在您的主代码中:

//班长

var _newClass:NewClass = new NewClass();
_newClass.addEventListener("my_event"), handler);
然后在NewClass中分派事件

//class NewClass
this.dispatchEvent(new Event("my_event"));
现在,您似乎启动了事件,但是您将侦听器添加到了错误的对象(在本例中,我认为是主类,它没有执行分派)

注意-如果您在NewClass的构造函数中调度事件,您可能会错过该事件,因为您将在触发事件后分配侦听器。所以把它放在别处

  • 更新-
正如@red温室和@prototypic所指出的,在这种情况下可以利用气泡。但也有一些局限性

通常,如果eventListener方法sig中的use_capture参数==
false
(默认值),则确实需要直接将对象作为目标来接收事件。要启用气泡阶段,请执行以下操作:

this.addEventListener("my_event", handler, true); //use_capture == true
分派事件的子级的父级现在将成为事件的合格目标,因为它“冒泡”备份层次结构。在这种情况下,@red温室的答案是正确的。这里的一个重要例外是冒泡仅适用于DisplayObjects。NewClass必须扩展DisplayObject或祖先,并添加到显示列表中,才能正常运行冒泡

来自liveDocs

当事件对象在显示列表中从一个节点移动到另一个节点时,会发生捕获和冒泡:父对象到子对象用于捕获,子对象到父对象用于冒泡。此过程与继承层次结构无关。除了目标阶段外,只有DisplayObject对象(容器和控件等可视对象)可以有捕获阶段和冒泡阶段


有关事件传播这一非常重要主题的完整讨论,请查看此内容。

您需要将侦听器分配给正在调度它的对象。从您的代码中,不清楚是什么在做什么-但是,例如,在您的主代码中:

//班长

var _newClass:NewClass = new NewClass();
_newClass.addEventListener("my_event"), handler);
然后在NewClass中分派事件

//class NewClass
this.dispatchEvent(new Event("my_event"));
现在,您似乎启动了事件,但是您将侦听器添加到了错误的对象(在本例中,我认为是主类,它没有执行分派)

注意-如果您在NewClass的构造函数中调度事件,您可能会错过该事件,因为您将在触发事件后分配侦听器。所以把它放在别处

  • 更新-
正如@red温室和@prototypic所指出的,在这种情况下可以利用气泡。但也有一些局限性

通常,如果eventListener方法sig中的use_capture参数==
false
(默认值),则确实需要直接将对象作为目标来接收事件。要启用气泡阶段,请执行以下操作:

this.addEventListener("my_event", handler, true); //use_capture == true
分派事件的子级的父级现在将成为事件的合格目标,因为它“冒泡”备份层次结构。在这种情况下,@red温室的答案是正确的。这里的一个重要例外是冒泡仅适用于DisplayObjects。NewClass必须扩展DisplayObject或祖先,并添加到显示列表中,才能正常运行冒泡

来自liveDocs

当事件对象在显示列表中从一个节点移动到另一个节点时,会发生捕获和冒泡:父对象到子对象用于捕获,子对象到父对象用于冒泡。此过程与继承层次结构无关。除了目标阶段外,只有DisplayObject对象(容器和控件等可视对象)可以有捕获阶段和冒泡阶段


有关事件传播这一非常重要主题的完整讨论,请查看此答案。

此答案和另一答案中有关冒泡的信息可能应结合起来,形成最终答案。两者都可以工作(假设他的导航菜单确实连接到主类),但排除这两种解决方案似乎都不对。不过我建议解释一下冒泡的原因。这个答案和另一个答案中关于冒泡的信息应该结合起来作为最终答案。两者都可以工作(假设他的导航菜单确实连接到主类),但排除这两种解决方案似乎都不对。不过我建议解释一下冒泡的原因。