2010-07-16 5 views
1

J'ai 2 fichiers, 1 pour envoyer l'événement et 1 pour le recevoir (bien sûr en plus de la classe d'événement elle-même).Ne pas recevoir un événement tiré d'une classe .AS

Je l'ai déjà fait avec à la fois l'envoi et la réception de fichiers en mxml, mais cette fois the dispatching file is an actionscript class, et ça ne fonctionne pas cette fois. Est-ce différent pour les classes ActionScript?

est ici une version abêtis

La classe dispatching distribue l'événement dès sa création.

public class ASClass extends UIComponent{ 

    public function ASClass(){ 
     dispatchEvent(new MyEvents(MyEvents.FIRE_EVENT)); 
    } 
} 

dans ma principale application MXML, j'instancier le ASClass qui transmet automatiquement les cas dès qu'il est créé et la principale application MXML doit recevoir en retour. Mais quelque chose ne fonctionne pas.

protected function appCComplete(event:FlexEvent):void{ 
    addEventListener(MyEvents.FIRE_EVENT, gotEvent); 
    var asClass:ASClass = new ASClass(); 

} 

protected function gotEvent(event:MyEvents):void{ 
     Alert.show("got event");   
} 

Répondre

2
addEventListener(MyEvents.FIRE_EVENT, gotEvent); 

est la même que

this.addEventListener(MyEvents.FIRE_EVENT, gotEvent); 

qui écoute les FIRE_EVENT envoyé par this objet - votre principale application MXML. Pour écouter les événements déclenchés depuis l'objet asClass, vous devez appeler addEventListener sur cet objet.

asClass.addEventListener(MyEvents.FIRE_EVENT, gotEvent); 

Ainsi, vous ne pouvez pas écouter les événements tirés du constructeur. Le code suivant montre la manière correcte d'écouter les événements déclenchés par l'objet asClass (de n'importe où sauf le constructeur).

Si vous y pensez, vous pouvez voir que c'est logique. Le constructeur est utilisé pour créer un objet - les abonnés à un événement sont normalement intéressés par certaines actions/changements survenant à l'objet une fois que l'objet est entièrement construit et fonctionnel. Cela dit, vous pouvez passer une référence à this ou la fonction au constructeur de ASClass, puis affecter cette fonction en tant qu'écouteur d'événements depuis le constructeur si vous le souhaitez.

public class ASClass extends UIComponent{ 
     public function ASClass(listener:Function){ 
      this.addEventListener(MyEvents.FIRE_EVENT, listener); 
      dispatchEvent(new MyEvents(MyEvents.FIRE_EVENT)); 
     } 
    } 

    var asClass:ASClass = new ASClass(this.gotEvent);//pass the function. 

//or 

    public class ASClass extends UIComponent{ 
     public function ASClass(listenerObj:Object){ 
      this.addEventListener(MyEvents.FIRE_EVENT, listenerObj.gotEvent); 
      dispatchEvent(new MyEvents(MyEvents.FIRE_EVENT)); 
     } 
    } 

    var asClass:ASClass = new ASClass(this);//pass the object. 

Personnellement, je ne peux pas penser à de nombreux scénarios où je veux aller dans cette voie: envisager une certaine façon que vous reconception écouter les événements après le retour du constructeur.

+1

@cooper Il n'y aura pas de conditions de course. Le point principal est que vous devriez appeler l'écouteur d'événement avec l'objet qui distribue l'événement. Vous devriez donc appeler 'asClass.addEventListener' - vous ne pouvez pas le faire avant l'appel au constructeur car' asClass' est nul à ce moment-là. Encore une fois, l'écouteur d'événement doit être ajouté avant l'envoi de l'événement, mais vous ne pouvez le faire qu'après la création de l'objet de répartition. – Amarghosh

+1

_il ne sera pas plus lent que l'ASClass qui distribue l'événement._ Je ne suis pas sûr de vous avoir compris ici .. – Amarghosh

Questions connexes