2010-09-13 3 views
0

J'essaie d'appeler un événement que j'ai créé dans un autre composant. J'ai ajouté trace() dans mes méthodes pour voir ce que l'on appelle. Tout sauf l'écouteur d'événement (myEvent) est appelé. Quelqu'un peut-il me dire pourquoi c'est s'il vous plaît?Flex 4: Event Listener créé, mais pas appelé?

Toute aide serait grandement appréciée. Merci d'avance.

// TestApp.mxml (application) 
<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
         xmlns:s="library://ns.adobe.com/flex/spark" 
         xmlns:mx="library://ns.adobe.com/flex/mx" 
         xmlns:com="com.*" 
         creationComplete="initApp()"> 
    <fx:Script> 
     <![CDATA[ 
      import com.MyPopUp; 

      import mx.managers.PopUpManager; 
      protected function initApp():void 
      { 
       var popUp:MyPopUp = new MyPopUp();  

       PopUpManager.addPopUp(popUp, this); 
      }  
     ]]> 
    </fx:Script> 
    <com:MyComp/> 
</s:WindowedApplication> 

// MyComp.mxml (component) 
<?xml version="1.0" encoding="utf-8"?> 
<s:VGroup xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/mx" 
      width="100%" height="100%" 
      creationComplete="initComp()"> 
    <fx:Script> 
     <![CDATA[ 
      import mx.controls.Alert; 
      import mx.events.DynamicEvent; 

      protected function initComp():void 
      { 
       trace('init MyComp()'); 

       this.addEventListener('myEvent', myEvent); 
      } 

      private function myEvent(event:DynamicEvent):void 
      { 
       trace('myEvent()'); 

       Alert.show('Event Called!', 'Success'); 
      } 
     ]]> 
    </fx:Script> 
</s:VGroup> 

// MyPopUp.mxml (component) 
<?xml version="1.0" encoding="utf-8"?> 
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     xmlns:mx="library://ns.adobe.com/flex/mx" width="100" height="100"> 
    <fx:Script> 
     <![CDATA[ 
      import mx.events.DynamicEvent; 
      import mx.managers.PopUpManager; 

      private function call(event:MouseEvent):void 
      { 
       trace('call()'); 

       PopUpManager.removePopUp(this); 

       var evt:DynamicEvent = new DynamicEvent('myEvent'); 
       evt.value1 = '1234'; 

       dispatchEvent(evt); 
      } 
     ]]> 
    </fx:Script> 
    <s:Button click="call(event)" label="Call Event"/> 
</s:Group> 

Répondre

2

Mycomp et MyPopup ne sont pas dans la même hiérarchie de la liste d'affichage, de sorte que l'événement bouillonnement n'est pas vu. Si vous souhaitez envoyer des messages à travers des composants de cette manière, envisagez d'utiliser un type de répartiteur d'événements globaux, en utilisant un modèle partagé entre les deux composants afin de voir les changements de données.

+0

Je ne connais pas encore Flex, pourriez-vous nous donner un exemple de ce que vous voulez dire s'il vous plaît? Y a-t-il des cadres qui peuvent le faire facilement? – Reado

+0

L'ajout d'écouteurs d'événement à FlexGlobals.application (j'utilise 3.5 pour oublier le nom de propriété correct) ou la création d'une implémentation singleton de I/EventDispatcher sont deux manières moins élégantes mais des solutions rapides pour une petite application. – jooks

+1

Le bus d'événement dans Spring Actionscript est un bon début. –