我真的好奇为什么会这样.我创建了两个对象.一个是另一个孩子.我在事件监听器ADDED_TO_STAGE中注册了两个.classB中的onAdded方法执行两次.
为什么会发生这种情况?如何防止这种行为?
thanx回答
public class ClassA extends Sprite
{
public function ClassA ()
{
this.addEventListener(Event.ADDED_TO_STAGE, onAdded);
}
private function onAdded(e:Event):void
{
trace("ON ADDED 1");
var classB : ClassB = new ClassB();
addChild(classB);
}
}
public class ClassB extends Sprite
{
public function ClassB ()
{
this.addEventListener(Event.ADDED_TO_STAGE, onAdded);
}
private function onAdded(e:Event):void
{
trace("ON ADDED 2");
}
}
Run Code Online (Sandbox Code Playgroud)
OUTPUT:ON ADDED 1 ON ADDED 2 ON ADDED 2
从这里:有两个类似的事件:
Event.ADDED_TO_STAGE
Event.ADDED
Run Code Online (Sandbox Code Playgroud)
它们之间有区别:
添加
将侦听DisplayObject添加到另一个DisplayObject时(无论它是否为Stage对象),都会调度它.如果将任何其他DisplayObject添加到侦听DisplayObject,它也会被调度.
ADDED_TO_STAGE
将侦听DisplayObject添加到舞台或添加到舞台的任何其他DisplayObject时调度.
在你的情况下,它发送两次:
1)ClassB被添加到已添加到舞台的ClassA中.
2)ClassB被添加到舞台上.
这是一种低级API.如果.parent是Stage,则可以提供自定义逻辑.基本上你知道的,你真的不需要听这个,你可以打电话:
this.removeEventListener(Event.ADDED_TO_STAGE, onAdded);
Run Code Online (Sandbox Code Playgroud)
防止两次调用onAdded.
防止这种情况的另一种方法是在构造classA时添加classB:
private classB:ClassB = new ClassB();
public function ClassA ()
{
addChild(classB);
this.addEventListener(Event.ADDED_TO_STAGE, onAdded);
}
Run Code Online (Sandbox Code Playgroud)