2010-07-03 3 views
1

Bonne journée!Qu'est-ce que 'this' dans les gestionnaires d'événements anonymes dans AS3

J'ai remarqué que dans le gestionnaire d'événements anonymes this est référencé à global, pas ma classe. Je sais que je peux utiliser des variables référencées externes (parce qu'il crée des fermetures), mais comment obtenir le bon contexte?

Exemple simple:

_movieClipClassVariable = new MyCustomSpriteSubclass();  
_movieClipClassVariable.addEventListener(MouseEvent.CLICK, function(event:Event):void { 
      trace(this); //gives 'global' 
});      

Qu'en est-utilisation de la mémoire et des objets de collecte des ordures avec des gestionnaires anonymes? Est-ce que déclarer les gestionnaires comme méthode de classe est préférable?

Répondre

1

Je pense que la plupart du temps une méthode déclarant dans la classe est le meilleur choix, (parce que vous ne devez pas penser à la portée, de supprimer les auditeurs, de ne pas accidentellement obtenir les ordures collectées, .. .) Cependant, il existe des cas où une fonction anonyme peut être une approche concise et claire. Ça dépend.

Par exemple:

public class XYZ extends Sprite { 
    ... 

    private function renderBtn() : void {  
     var btn : SomeButton = new SomeButton(); 

     var ref : XYZ = this; 

     btn.addEventListener(MouseEvent.CLICK, function(event:Event):void { 
      trace("XYZ instance: " + ref); 
      btn.removeEventListener(MouseEvent.CLICK, arguments.callee); 
      removeChild(btn); 
      proceed(); 
     });  

     addChild(btn); 
    } 

    private function proceed() : void { 
     ... 
1

Oui, vous devriez vraiment déclarer une classe pour ne pas finir dans les airs.

La technique de délégation utilisée ici est principalement utilisée en Javascript. En tant que développeur flash, je vous recommande de nommer la fonction et de la garder ensemble dans une classe. En ce qui concerne la récupération de place, vous devez supprimer EventListener avec exactement la même syntaxe que addEvenListener afin de le libérer pour la récupération de place.

HTH

+0

Pour autant que je sais que ce n'est pas impossible d'enlever les écouteurs d'événements anonymes (sans hacks méchant). Donc, il semble supprimer les auditeurs que je dois déclarer comme méthode de classe. – artvolk

1

Au lieu d'ajouter la déclaration de fonctions à l'intérieur de l'écouteur d'événement, déclarer la méthode dans votre classe.

class myTestClass 
{ 
    private function listenForEvents():void 
    { 
      _movieClipClassVariable = new MyCustomSpriteSubclass();  
      _movieClipClassVariable.addEventListener(MouseEvent.CLICK, onClipClassClickHandler); 
    } 

    private function onClipClassClickHandler(event:MouseEvent):void 
    { 
      trace(this); // this is the instance of current "myTestClass" 
    } 
} 
Questions connexes