2008-09-25 8 views
2

Dans certains cas, je n'arrive pas à obtenir des composants pour recevoir des événements.Flex: Pourquoi ne puis-je pas gérer certains événements?

[modifier]

Pour clarifier les choses, l'exemple de code est juste pour l'amour de démonstration, ce que je vraiment demandé était s'il y avait un emplacement central qu'un auditeur pourrait être ajouté, auquel on peut envoyer de manière fiable les événements à et d'objets arbitraires. J'ai fini par utiliser parentApplication pour envoyer et recevoir l'événement que je devais gérer.

[/ modifier]

Si deux composants ont des parents différents, ou comme dans l'exemple ci-dessous, on est un popup, il semblerait l'événement n'a jamais atteint l'auditeur (voir la méthode « PopUp » pour l'envoi Je pense

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
     layout="absolute" 
     initialize="init()"> 
<mx:Script> 
    <![CDATA[ 
     import mx.controls.Menu; 
     import mx.managers.PopUpManager; 

     // Add listeners 
     public function init():void 
     { 
      this.addEventListener("child", handleChild); 
      this.addEventListener("stepchild", handleStepchild); 
     } 

     // Handle the no pop button event 
     public function noPop(event:Event):void 
     { 
      dispatchEvent(new Event("child")); 
     } 

     // Handle the pop up 
     public function popUp(event:Event):void 
     { 
      var menu:Menu = new Menu(); 
      var btnMenu:Button = new Button(); 
      btnMenu.label = "stepchild"; 
      menu.addChild(btnMenu); 
      PopUpManager.addPopUp(menu, this); 

      // neither of these work... 
      this.callLater(btnMenu.dispatchEvent, [new Event("stepchild", true)]); 
      btnMenu.dispatchEvent(new Event("stepchild", true)); 
     } 

     // Event handlers 

     public function handleChild(event:Event):void 
     { 
      trace("I handled child"); 
     } 

     public function handleStepchild(event:Event):void { 
      trace("I handled stepchild"); 
     } 
    ]]> 
</mx:Script> 

<mx:VBox> 
    <mx:Button label="NoPop" id="btnNoPop" click="noPop(event)"/> 
    <mx:Button label="PopUp" id="btnPop" click="popUp(event)"/> 
</mx:VBox> 
</mx:Application> 

de contournements, mais il semble que il devrait y avoir un bus événement central ...

Suis-je manque quelque chose: qui ne fonctionne pas)?

Répondre

2

Ci-dessus est correct. Vous envoyez l'événement à partir de btnMenu, mais vous n'écoutez pas les événements sur btnMenu - vous écoutez des événements sur l'Application.

soit l'envoi de l'application:

dispatchEvent(new Event("stepchild", true)); 

ou écouter les btnMenu

btnMenu.addEventListener("stepchild",handleStepChild); 
btnMenu.dispatchEvent(new Event("stepchild",true)); 
0

Vous associez l'écouteur à this lorsque l'événement est distribué depuis btnMenu.

Cela devrait fonctionner:

 
dispatchEvent(new Event("stepchild", true)); 

ps. Il n'y a vraiment aucune raison de mettre un 'this' partout, sauf si cela est explicitement requis pour surmonter les problèmes de portée. Dans ce cas, vous pouvez simplement laisser tous les this.

+1

Merci pour la réponse, je « ce » par souci de lisibilité, pour le rendre très clair que chose est en train de faire lequel. –