2010-09-13 5 views
1

Je dois pouvoir appeler une méthode à partir d'un composant situé sous l'application principale dans Flex 4. Quelqu'un peut-il me dire s'il vous plaît comment faire ceci sans utiliser FlexGlobals?Flex 4: Accéder à la méthode publique dans l'application principale à partir du composant

Un exemple de code est joint. 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" 
         creationComplete="initApp()"> 
    <fx:Script> 
     <![CDATA[ 
      import com.TestComp; 

      import mx.managers.PopUpManager; 

      public function myMethod():void 
      { 
       // do something 
      } 

      protected function initApp():void 
      { 
       var popUp:TestComp = new TestComp(); 

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

// TestComp.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="400" height="300"> 
    <fx:Script> 
     <![CDATA[ 
      private function doSomething(event:MouseEvent):void 
      { 
       // call to myMethod() in TestApp.mxml 
      } 
     ]]> 
    </fx:Script> 
    <s:Button click="doSomething(event)" label="Click Me"/> 
</s:Group> 
+0

Je ne comprends pas ... pourquoi avez-vous un problème avec les appels FlexGlobals .topLevelApplication.doSomething(); ? ? ? ? –

+0

On m'a dit que c'était une mauvaise pratique. – Reado

+0

C'est une mauvaise pratique si vous développez un composant. Ensuite, si vous le chargez dans une autre application flexible, topLevelApplication sera quelqu'un d'autre. Tant que vous créez une application, elle est suffisamment sûre! ce n'est pas une bonne raison pour laquelle vous devriez envoyer/écouter des événements lorsque vous avez déjà accès à tout ce dont vous avez besoin. –

Répondre

2

C'est un mauvais design. Vous devez fournir une fonction de rappel ou un écouteur d'événement.

// TestComp.mxml 

<mx:Metadata> 
    [Event(name="doSomethingEvent", type="flash.events.Event")] 
</mx:Metadata> 

<mx:Script><![CDATA[ 

    private function doSomething(event:MouseEvent):void 
    { 
    this.dispatchEvent(new Event("doSomethingEvent")); 
    } 

]]></mx:Script> 

// TestApp.mxml 
protected function initApp():void 
{ 
    var popUp:TestComp = new TestComp(); 
    popUp.addEventListener("doSomethingEvent", myMethod); 
    PopUpManager.addPopUp(popUp, this, true); 
} 

private function myMethod(event: Event): void 
{ 
    // do something 
} 

Et ceci est un exemple de rappel:

// TestComp.mxml 

public var doSomethingCallback: Function; 

private function doSomething(event:MouseEvent):void 
{ 
    doSomethingCallback.call(); 
} 

// TestApp.mxml 
protected function initApp():void 
{ 
    var popUp:TestComp = new TestComp(); 
    popUp.doSomethingCallback = myMethod; 
    PopUpManager.addPopUp(popUp, this, true); 
} 

private function myMethod(): void 
{ 
    // do something 
} 
0

Je suis d'accord avec les éclaboussures que c'est une mauvaise conception, mais les éléments suivants doivent travailler

 
//in TestApp 
protected function initApp():void 
{ 
    var popUp:TestComp = new TestComp(this); 
    PopUpManager.addPopUp(popUp, this, true); 
} 

//in TestComp 
private var app:TestApp; 

public function TestComp(app:TestApp) 
{ 
    this.app = app; 
} 

private function doSomething(event:MouseEvent):void 
{ 
    // call to myMethod() in TestApp.mxml 
    app.myMethod(); 
} 

ou vous pourriez le faire de cette façon

 
//in TestApp 
protected function initApp():void 
{ 
    var popUp:TestComp = new TestComp(this); 
    popUp.addEventListener('test' , eventListener); 
    PopUpManager.addPopUp(popUp, this, true); 
} 
private function eventListener(event:Event):void 
{ 
    //in which case myMethod doesn't need to be public 
    myMethod(); 
} 

//in TestComp 
private function doSomething(event:MouseEvent):void 
{ 
    dispatchEvent(new Event('test')); 
} 
1

Opération la plus simple tion?

Retirez le gestionnaire de clic du bouton dans TestComp.

Dans votre application principale, ajoutez un écouteur à TestComp (s'il s'agit d'un enfant direct de l'application principale) ou à lui-même (si TestComp se trouve plus bas dans la liste d'affichage) pour MouseEvent.CLICK. Dans le gestionnaire, testez pour voir si la cible de l'événement est TestComp soit par == si vous avez une référence directe, soit par "est" sinon.

C'est le moins d'effort de ce que vous avez tout à l'heure, repose toujours sur (bouillonnement) des événements, et est plus « correct »

Questions connexes