2010-04-06 9 views
0

Je suis novice en Flex et je n'arrive pas à comprendre les événements. Je pense que les événements sont ce que je veux utiliser pour ma situation. J'ai 2 composants, addUser.mxml et listUsers.mxml. J'accède à ceux-ci à partir d'un ViewStack dans mon application principale. Lorsque je charge listUsers.mxml, il affiche une liste des utilisateurs actuels dans un DataGrid via un appel HTTPService. Lorsque j'ajoute un utilisateur en utilisant le formulaire sur addUser.mxml, je voudrais que la grille de données dans listUsers.mxml s'actualise lorsque je reviens à cette vue pour montrer le nouvel utilisateur. J'ai essayé plusieurs choses différentes avec addEventListener et dispatchEvent mais n'arrive pas à le faire fonctionner. Quelqu'un peut-il m'aider avec cette logique?Mise à jour de composants Flex externes à partir d'une action

-

Exemple de code pour commentaire, je l'ai analysé la substance non relative.

regard adduser comme ceci:

<mx:HTTPService id="httpService" 
     url="{'http://someurl.com'}" 
     useProxy="false" 
     method="POST" 
     fault="faultHandler()"  
     result="resultHandler(event)" 
     /> 


public function addUser():void{ 
      if(validateForm()){ 
       params = {}; 
       params['action'] = 'adduser'; 
       params['firstName'] = firstName.text;   
       params['lastName'] = lastName.text; 
       params['email'] = email.text; 
       params['isActive'] = isActive.selected; 

       httpService.cancel(); 
       httpService.addEventListener("result", addUserResult);      
       httpService.send(params); 
      } 
} 

public function addUserResult(event:ResultEvent):void{ 
      var result:Object = event.result; 

      //reset fields if add user was successful 
      if(result.returnXML.action=='adduser'){ 

       var m:String = result.returnXML.message.toString();         
        if(result.returnXML.status=='fail'){       
         Alert.show(m, null, Alert.OK, null, null, Application.application.IconError); 
        } 
        if(result.returnXML.status=='success'){      
         firstName.text = "";    
         lastName.text = ""; 
         email.text = ""; 
         isActive.selected = true; 

         Alert.show(m, null, Alert.OK, null, null, Application.application.IconSuccess); 
        }     
      }     
} 


<mx:Button id="addButton" label="Add" click="addUser();" /> 

listUsers ressemble à ceci:

<mx:HTTPService id="httpListService" 
     url="{'http://someurl.com'}" 
     useProxy="false" 
     method="POST" 
     fault="faultHandler()"  
     result="resultHandler(event)" 
     /> 


<mx:DataGrid id="dgUsers"       
       itemClick="dgClickEvent(event);"       
       width="85%" 
       maxHeight="500"    
       > 

       <mx:columns> 
        <mx:DataGridColumn headerText="First Name" dataField="fn" /> 
        <mx:DataGridColumn headerText="Last Name" dataField="ln" /> 
        <mx:DataGridColumn headerText="Email" dataField="email" /> 
        <mx:DataGridColumn headerText="Active" dataField="active" /> 
       </mx:columns> 
      </mx:DataGrid> 
+1

Pouvez-vous un peu de code? Il est difficile de savoir comment aider avec quelque chose de concret à travailler. – bedwyr

+0

J'ai ajouté du code ci-dessus, merci! – Scott

Répondre

0

Je ne pense pas que les auditeurs d'événement ne sont pas nécessairement le chemin à parcourir. Vous utilisez un écouteur d'événement pour faire quelque chose lors de la détection de quelque chose d'autre. c'est-à-dire l'écoute d'une souris sur un composant de l'interface utilisateur = détecter la souris, faire glisser l'opération. Compte tenu de votre exemple, je pense que vous avez juste besoin d'enchaîner vos fonctions ensemble. Il semble que votre fonction addUser enregistre l'utilisateur à la même source que les utilisateurs de la liste. Ainsi, dans votre position, j'appellerais httpService listUsers à la fin du résultat de l'ajout d'utilisateur pour actualiser les données qui peuplent le DataGrid.

httpListService.send() 

Je ne vois pas votre gestionnaire de résultat pour httpListService mais c'est où vous mettez à jour les données de votre dataGrid.

bonne chance, et s'il vous plaît signaler avec des complications.

+0

le gestionnaire de résultat pour httpListService est en effet où je mets à jour la grille de données dans le composant listUsers. Toutefois, addUser et listUsers sont deux composants distincts. Je comprends ce que vous dites si elles étaient 2 fonctions dans le même composant, mais comment puis-je déclencher la méthode httpListService.send() dans listUsers.mxml à partir d'une fonction dans addUser.mxml? J'ai essayé quelque chose dans addUser.mxml comme Application.application.listUsers.httpListService.send() mais cela n'a pas plu. Merci de votre aide! – Scott

+0

Voici une question où ils appellent une méthode sur l'application principale à partir d'un composant utilisant parentDocument, peut-être que cela vous aidera à vous rendre là où vous pouvez appeler cette méthode à partir du composant enfant. http://stackoverflow.com/questions/205359/flex-call-function-from-included-component – invertedSpear

0

Ça a marché. Voici ce que j'ai fait: à chaque fois que la vue parent met en évidence la vue listUsers, elle envoie le httpListService et actualise la grille de données indépendamment des événements (ou non) du composant addUser ou de tout autre composant. cela ajoute au trafic réseau mais, pour la portée de mon projet, c'est acceptable.

dans listUsers.mxml:

<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()"> 

... 

public function init():void{ 
    //vsUsers is my view stack on the main application component 
    Application.application.vsUsers.addEventListener(IndexChangedEvent.CHANGE, refreshUsersGrid);   
} 

... 

public function refreshUsersGrid(e:IndexChangedEvent):void{  
    //if the new viewable child is the list users view, then refresh the datagrid 
    if(Application.application.vsUsers.getChildAt(e.newIndex).name=='viewListUsers'){    
     //the sendListUsersRequest method fires the HTTPService send method and binds the results to the datagrid 
     sendListUsersRequest(); 
    } 
}