5

なぜこれが起こっているのか、私は本当に好奇心が強いです。2 つのオブジェクトを作成しました。1 つは別の子です。イベントリスナーADDED_TO_STAGEで両方を登録しました。classB のメソッド onAdded が 2 回実行されます。

なぜこれが起こっているのですか?どうすればこの動作を防ぐことができますか?

答えてくれてありがとう

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");
        }
}

出力: ON ADDED 1 ON ADDED 2 ON ADDED 2

4

2 に答える 2

9

ここから: 2 つの同様のイベントがあります。

Event.ADDED_TO_STAGE
Event.ADDED

それらの間には違いがあります:

追加した

リッスンしている DisplayObject が別の DisplayObject に追加されたときにディスパッチされます (ステージ オブジェクトであるかどうかに関係なく)。また、リスニング DisplayObject に他の DisplayObject が追加された場合にもディスパッチされます。

ADDED_TO_STAGE

リスニング DisplayObject がステージに追加されたとき、またはステージに追加された他の DisplayObject にディスパッチされます。


あなたの場合、2回ディスパッチします:

1) ステージに既に追加されている ClassA に ClassB が追加されます。

2) ClassB がステージに追加されます。

それはちょっと低レベルのAPIです。.parent が Stage であるかどうかにかかわらず、カスタム ロジックを提供できます。基本的に、これを聞く必要はなく、次のように呼び出すことができます。

this.removeEventListener(Event.ADDED_TO_STAGE, onAdded);

onAdded を 2 回呼び出さないようにします。

これを防ぐ別の方法は、classA の構築中に classB を追加することです。

private classB:ClassB = new ClassB();
public function ClassA () 
{
    addChild(classB);
    this.addEventListener(Event.ADDED_TO_STAGE, onAdded);
}
于 2013-07-06T18:29:55.323 に答える