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
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? –
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
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? –