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