2009-07-21 5 views
0

J'essaie ma première application flexible. Et vous avez des problèmes pour ajouter des données du service http xml à datagid.Datagrid de remplissage du service http à distance

Mon fichier xml ressemble à ceci:

<players> 

    <player> 
    <name>test</name> 
    <status>F</status> 
    <claimed>1</claimed> 
    </player> 

    <player> 
    <name>meta</name> 
    <status>F</status> 
    <claimed>1</claimed> 
    </player> 
</players> 

Tout d'abord j'ai essayé de remplir les données d'une manière brute, ainsi créée balise MXML pour le service HTTP et gestionnaires ajouté.

Mais très vite j'ai réalisé que le fichier de l'application principale devenait illisible (à cause de l'énorme quantité de code), donc j'ai décidé de l'organiser d'une certaine façon. Ainsi, nous avons décidé de remplacer les services par des classes séparées.

Mon nouveau code ressemble à ceci:

MXML:

<?xml version="1.0" encoding="utf-8"?> 
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
      layout="absolute" creationComplete="main()" height="756" borderColor="#FFFFFF" width="950" top="10" left="10" horizontalAlign="left" verticalAlign="top" backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#FCFCFC, #FCFCFC]"> 

     <mx:Panel width="900" height="727" layout="absolute" title="Игра ГО" horizontalAlign="center" horizontalCenter="0" top="10"> 
     <mx:Script> 
      <![CDATA[ 

       import goclient.ListOfPlayers; 
       import goclient.usersList; 
       import goclient.Tester; 
       import mx.controls.Alert; 
       // And makes periodical requests to the server 
       [Bindable] 
       public var users:ListOfPlayers; 
       [Bindable] 
       public var test:Tester; 

       public function main():void{ 
        test = new Tester(); 
        users = new ListOfPlayers(); 



       }   

      ]]> 
     </mx:Script> 


      <mx:DataGrid doubleClickEnabled="true" dataProvider="{users.getPlayersList()}" 
       x="10" y="157" width="860" height="520" id="userList"> 
       <mx:columns> 
        <mx:DataGridColumn dataField="claimed" headerText="Was claimed" width="25"/> 
        <mx:DataGridColumn dataField="name" headerText="Name of the player" /> 
        <mx:DataGridColumn dataField="status" headerText="Status (Free or Busy)" /> 
       </mx:columns> 
      </mx:DataGrid> 

Et la classe de service:

ListOfPlayers.as 

package goclient 
{ 
    import flash.utils.Timer; 
    import mx.controls.Alert; 
    import mx.collections.ArrayCollection; 
    import mx.rpc.events.ResultEvent; 
    import mx.rpc.http.mxml.HTTPService; 

    public class ListOfPlayers 
    { 
     public var usersListService:HTTPService; 
     private var minTimer:Timer = new Timer(100000, 0); 
     private var playersData:ArrayCollection;  
     private var person:currentPerson; 

     public function ListOfPlayers() 
     { 
      usersListService = new HTTPService(); 
      usersListService.url = "http://127.0.0.1:8000/go/active/"; 
      usersListService.addEventListener(ResultEvent.RESULT, resultHandler); 
      //Alert.show("Here"); 
      sendData(); 
      //minTimer.addEventListener(TimerEvent.TIMER, sendData); 
      //minTimer.start(); 

     } 

     public function getResp():String 
     { 
      return "Resr"; 
     } 

     public function resultHandler(event:ResultEvent):void 
     { 
      //person = new currentPerson(event.result.current.username, event.result.current.img, event.result.current.rank); 
      playersData = event.result.players.player; 
      Alert.show("resh"); 

     } 
     public function sendData():void 
     { 
      usersListService.send(); 
     } 

     public function getPlayersList():ArrayCollection 
     { 
      Alert.show(playersData.toString()); 
      return playersData; 
     } 

    } 
} 

Le problème est que rien est affiché dans le DataGrid

Je suis juste un débutant, alors s'il vous plaît conseil ce que je me suis trompé avec la classe

Répondre

2

La fonction de résultat (dans la classe ListOfPlayers) doit donner la liste des lecteurs et non la fonction qui appelle le service Web.

Ce que vous pouvez faire est d'ajouter ceci dans la classe de serveur:

[Bindable] 
public var playersData:ArrayCollection; 

et votre point de vue également ajouter cette variable avec la balise bindable et définissez la valeur ajouter cette ligne dans les principaux(): playersData = utilisateurs .playersData;

alors le dataprovider DataGrid est "{playersData}"

cela devrait fonctionner. Mais avec la liste XML, il est toujours un peu difficile de savoir à quelle profondeur vous êtes dans l'arbre;)

+0

Pourriez-vous s'il vous plaît m'expliquer un peu. Quand j'apprenais quelques livres sur OOD, partout où je vois, vous devriez ajouter des variables privées et des fonctions d'accès publiques (getters et setters) Et ce que je dois faire maintenant - définir la variable publique dans la classe. Est-ce que c'est OK? –

+0

En effet, c'est une meilleure pratique. Mais vous devez savoir quand les données de playersData sont modifiées. Je fais cela en le rendant Bindable. Vous pouvez rendre un getter lisible mais cela rend l'exemple beaucoup plus complexe. Mais il vaut mieux le faire avec des getters et des setters. – Arno

+0

Encore une chose: Je viens de remarquer qu'il y a un problème dans cette ligne: playersData = event.result.players.player; Semble-t-il plus correct de créer ArrayCollection ici? par exemple. playersData = ArrayCollection (event.result.players.player); Mais ce code ne fonctionne pas (donne l'erreur qu'il ne peut pas convertir la collection de tableau en tableau ....) pourquoi? –

Questions connexes