2009-07-21 4 views
0

Ich versuche meine erste Flex-Anwendung. Und Probleme beim Hinzufügen von Daten von XML-HTTP-Dienst zu Datagid.Füllen von Datagrid von remote HTTP-Dienst

Meine XML-Datei sieht wie folgt aus:

<players> 

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

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

Zuerst habe ich versucht, die Daten in einer rohen Art und Weise zu füllen, so erstellt MXML-Tag für HTTP-Dienst, und hinzugefügt Handler.

Aber sehr bald erkannte ich, dass Hauptanwendungsdatei (wegen der großen Menge an Code) unlesbar wurde, so entschied ich mich, es irgendwie zu organisieren.

Also entschieden, Services durch eine separate als Klassen zu ersetzen.

Mein neuer Code sieht wie folgt aus:

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> 

Und die Serviceklasse:

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; 
     } 

    } 
} 

Das Problem ist, dass nichts in der Datagrid angezeigt wird

Ich bin nur ein Anfänger, also bitte beraten, was habe ich falsch mit der Klasse

Antwort

2

Die Ergebnisfunktion (in der ListOfPlayers-Klasse) sollte die Liste der Player und nicht die Funktion angeben, die den Webservice aufruft.

Was könnten Sie tun, ist diese Klasse in Server hinzufügen:

[Bindable] 
public var playersData:ArrayCollection; 

und Ihrer Ansicht nach fügen ebenfalls diese Variable mit dem bindable Tag und setzen Sie den Wert dieser Zeile in Haupt hinzufügen(): playersData = users .playersDaten;

dann das Datagrid Dataprovider ist "{} playersData"

sollte diese Arbeit. Aber mit XML-Liste ist es immer ein bisschen schwierig zu wissen, wie tief Sie in dem Baum sind;)

+0

Könnten Sie mir bitte ein bisschen erklären. Als ich einige Bücher über OOD lernte, sollte ich überall private Variablen und öffentliche Zugriffsfunktionen (Getter und Setter) hinzufügen. Und was ich jetzt tun muss - definieren Sie die öffentliche Variable in der Klasse. Ist das in Ordnung? –

+0

In der Tat ist das eine bessere Praxis. Aber du musst wissen wann die playersData Daten geändert werden. Ich mache das, indem ich es bindbar mache. Sie können einen Getter bindbar machen, aber das macht das Beispiel viel komplexer. Aber es ist besser, es mit Gettern und Setter zu machen. – Arno

+0

Noch eine Sache: Ich habe gerade festgestellt, dass es ein Problem in dieser Zeile gibt: playersData = event.result.players.player; Scheint es richtiger ArrayCollection hier zu erstellen? z.B. playersData = ArrayCollection (event.result.players.player); Aber dieser Code funktioniert nicht (gibt Fehler, dass Array-Sammlung nicht in Array konvertieren kann ....) Warum? –