2010-02-01 12 views
1

Je suis un Noob Flex/Flash complet, exécutant Adobe Flash Builder 4 Beta 2. J'ai un composant principal qui doit pouvoir appeler plusieurs fenêtres contextuelles, chacune étant la même à l'exception d'une fonction et de quelques étiquettes. Évidemment, je préférerais pouvoir définir cette fonction et changer ces étiquettes en appelant le popup au lieu d'avoir des tonnes de fichiers .mxml avec presque le même code, je ne sais juste pas comment le faire. J'ai compris comment je peux changer les étiquettes, mais je ne sais pas comment redéfinir la fonction.Flex - Comment définir une fonction dans un composant à partir d'un autre?

Par souci de simplicité, disons que mon code ressemble à ceci:

main.mxml:

<?xml version="1.0" encoding="utf-8"?> 
    <mx:Module xmlns:fx="http://ns.adobe.com/mxml/2009" :s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/halo" creationComplete="init()"> 
     <fx:Script> 
      <![CDATA[ 
       import mx.controls.Alert; 
       import mx.managers.PopUpManager; 

       protected function init():void 
       { 
        var alertWindow:IFlexDisplayObject = PopUpManager.createPopUp(FlexGlobals.topLevelApplication as DisplayObject, popup, true); 
        PopUpManager.centerPopUp(alertWindow); 
        var popInstance:transmitRoundPop = alertWindow as transmitRoundPop; 
        popInstance.btnTest.label = "NEW"; 
       } 
      ]]> 
     </fx:Script> 
    </mx:Module> 

popup.mxml:

<?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/halo" width="400" height="300" xmlns:flash="services.flash.*"> 
     <fx:Script> 
      <![CDATA[ 
       import mx.controls.Alert; 
       import mx.managers.PopUpManager; 

       public function test():void 
       { 
        Alert.show("ORIGINAL"); 
        PopUpManager.removePopUp(this); 
       } 
      ]]> 
     </fx:Script> 
     <s:Panel x="10" y="10" width="380" height="280" title="Test" id="pnlTest"> 
       <s:Button x="131" y="104" label="OLD" id="btnTest" click="test()"/> 
     </s:Panel> 
    </s:Group> 

disent Maintenant, je veux changer test() en popup.mxml lorsque vous l'appelez dans main.mxml ... comment faire? S'il vous plaît inclure des détails ... rappelez-vous que je suis un noob :-)

+0

qu'entendez-vous par le test de changement()? Changer le code dedans? Les paramètres? – CookieOfFortune

+0

Désolé, je ne pensais pas bien. Je voulais changer le code, ou plus exactement remplacer/redéfinir/redéfinir la fonction, mais je pense avoir trouvé la bonne façon de le faire maintenant. – Travesty3

Répondre

1

Bien sûr, immédiatement après l'affichage de la question l'idée apparaît dans ma tête. Je pensais que je posterais la solution ici au lieu de simplement supprimer la question au cas où cela aiderait quelqu'un d'autre.

Je viens pris test() complètement de popup.mxml et modifié en init() main.mxml pour ressembler à ceci:

protected function init():void 
{ 
    var alertWindow:IFlexDisplayObject = PopUpManager.createPopUp(FlexGlobals.topLevelApplication as DisplayObject, popup, true); 
    PopUpManager.centerPopUp(alertWindow); 
    var popInstance:transmitRoundPop = alertWindow as transmitRoundPop; 
    popInstance.btnTest.label = "NEW"; 
    popInstance.btnTest.addEventListener("click", function():void { Alert.show("REDEFINED"); }); 
} 
0

Si j'obtiens ce que vous demandez, vous pouvez faire tester() une variable de fonction et lui donner un accès public afin que les autres composants puissent le changer.

<fx:Script> 
     <![CDATA[ 
      import mx.controls.Alert; 
      import mx.managers.PopUpManager; 

      // "test" is now a function variable, 
      // you change it just like any other variable, 
      // but you can call it as well, just like before. 
      public var test:Function; 

      public function defaultTest():void 
      { 
       Alert.show("ORIGINAL"); 
       PopUpManager.removePopUp(this); 
      } 

      protected function init():void 
      { 
      // Setting a default value for test 
      // otherwise it would give you an error when calling 
      // an unassigned function variable. 
       this.test = defaultTest; 
       ... 
      } 
     ]]> 
    </fx:Script> 

maintenant dans un autre composant:

public function mainTest():void 
{ 
    ... 
} 

... 
myPopup.test = mainTest; // setting the variable, note that there are no parentheses. 
myPopup.test(); // running the function, note that there are now parentheses. 
+0

J'ai essayé ça aussi, mais ça n'a pas vraiment marché pour moi. La fonction est appelée lorsque l'utilisateur clique sur un bouton dans la fenêtre contextuelle. La fonction doit donc être appelée à partir de popup.mxml, pas de main.mxml. Même après avoir fait myPopup.test = mainTest, il appelait toujours defaultTest(). Je soupçonne (peut-être tort) que c'est parce que la fenêtre contextuelle a déjà été créée à ce moment-là. Je ne peux pas changer la fonction avant que la popup soit créée parce que j'ai besoin du popup pour le faire. Là encore, il est également possible que je ne l'ai pas fait correctement ... votre chemin a aussi beaucoup de sens pour moi. – Travesty3

+0

Oui, je crois que le PopupManager crée son propre popup. Je crois que votre code ci-dessus fait partie de alertWindow. – CookieOfFortune