2013-07-06 15 views
5

Sono davvero curioso perché sta succedendo. Ho creato due oggetti. Uno è figlio di un altro. Mi sono registrato entrambi con l'ascoltatore di eventi ADDED_TO_STAGE. Il metodo onAdded in classB viene eseguito due volte.Evento ADDED_TO_STAGE eseguito più volte as3

Perché sta succedendo e come posso evitare questo comportamento?

grazie per la risposta

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

USCITA: ON aggiunto 1 ON AGGIUNTO 2 ON AGGIUNTO 2

risposta

9

Da here: Ci sono due eventi simili:

Event.ADDED_TO_STAGE 
Event.ADDED 

Ci sono differenza tra loro:

AGGIUNTO

viene inviato quando il DisplayObject ascolto si aggiunge ad un altro DisplayObject (non importa se si tratta di un oggetto Stage o meno). Inoltre viene inviato se qualsiasi altro DisplayObject viene aggiunto all'oggetto DisplayObject in ascolto.

ADDED_TO_STAGE

viene inviato quando il DisplayObject ascolto viene aggiunto alla fase oa qualsiasi altra DisplayObject che viene aggiunto alla fase.


Nel tuo caso invia due volte:

1) ClassB si aggiunge a quella già ClasseA aggiunto allo stage.

2) ClassB viene aggiunto allo stage.

È un'API di basso livello. È possibile fornire una logica personalizzata in caso di .parent è Stage o no. Fondamentalmente quelli che sanno che, non si ha realmente bisogno di ascoltare questo e si può chiamare:

this.removeEventListener(Event.ADDED_TO_STAGE, onAdded); 

per evitare di chiamare onAdded due volte.

Un altro modo per evitare che è l'aggiunta di ClassB, mentre la costruzione classA:

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

grazie per avermi insegnato qualcosa di nuovo :) – Riddlah

0

È a causa di evento di bubbling.

Si dovrebbe rimuovere il listener di eventi, una volta onAddedToStage è chiamato, quindi la prima istruzione all'interno:

private function onAdded(e:Event):void 

dovrebbe essere

removeEventListener(Event.ADDED_TO_STAGE, onAdded); 
Problemi correlati