2013-07-06 12 views
5

Jestem naprawdę ciekawostką, dlaczego tak się dzieje. Stworzyłem dwa obiekty. Jedno jest dzieckiem drugiego. Zarejestrowałem się zarówno z odbiornikiem zdarzeń ADDED_TO_STAGE. Metoda onAdded w klasie B jest wykonywana dwukrotnie.Zdarzenie ADDED_TO_STAGE wykonane więcej razy as3

Dlaczego tak się dzieje i jak mogę temu zapobiec?

Dzięki za odpowiedź

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

WYJŚCIE: dodawanego 1 dodawanego 2 dodawanego 2

Odpowiedz

9

Od here: Istnieją dwa podobne wydarzenia:

Event.ADDED_TO_STAGE 
Event.ADDED 

Istnieje Różnica między nimi:

DODANO

zostanie wysłane, gdy DisplayObject słuchania jest dodawany do innej DisplayObject (bez względu na to czy jest to obiekt Stage, czy nie). Wywoływane jest także wtedy, gdy jakikolwiek inny obiekt DisplayObject zostanie dodany do odsłuchiwanego obiektu DisplayObject.

ADDED_TO_STAGE

zostanie wysłane, gdy DisplayObject słuchania jest dodawany do etapu lub do jakiegokolwiek innego DisplayObject, która jest dodawana do etapu.


W twoim przypadku to wywoła dwa razy:

1) ClassB zostanie dodany do ClassA że już na stole montażowym.

2) ClassB jest dodawany do stołu montażowego.

To trochę niski poziom API. Możesz zapewnić niestandardową logikę w przypadku .parent jest Stage lub nie. Zasadniczo te, wiesz, że naprawdę nie trzeba słuchać i to można nazwać:

this.removeEventListener(Event.ADDED_TO_STAGE, onAdded); 

aby zapobiec nazywając onAdded dwukrotnie.

Innym sposobem zapobiegania, że ​​jest dodanie ClassB podczas konstruowania ClassA:

private classB:ClassB = new ClassB(); 
public function ClassA() 
{ 
    addChild(classB); 
    this.addEventListener(Event.ADDED_TO_STAGE, onAdded); 
} 
+0

dziękuję za nauczenie mnie czegoś nowego :) – Riddlah

0

To ze względu na zdarzenie propagacji.

Powinieneś usuwając detektor zdarzeń raz onAddedToStage jest wywoływana, więc pierwszy oświadczenie Wewnątrz:

private function onAdded(e:Event):void 

powinny być

removeEventListener(Event.ADDED_TO_STAGE, onAdded);