私は最初のフレックスアプリケーションを試しています。 xml httpサービスからdatagidにデータを追加する際に問題があります。リモートhttpサービスからDatagridを入力する
私のxmlファイルは次のようになります。
<players>
<player>
<name>test</name>
<status>F</status>
<claimed>1</claimed>
</player>
<player>
<name>meta</name>
<status>F</status>
<claimed>1</claimed>
</player>
</players>
まず私は、HTTPサービスのように作成したMXMLタグ、生方法でデータを埋めるためにしようとした、とハンドラを追加しました。
しかし、まもなく私は、メインアプリケーションファイルが(膨大な量のコードのため)読めなくなったことに気づいたので、何らかの方法で整理することにしました。
サービスを別のクラスに置き換えることにしました。
私の新しいコードは次のようになります。
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>
とサービスクラス:
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;
}
}
}
問題は何もデータグリッドに示されていないということです
私はちょうど初心者なので、私はクラスで間違っていたアドバイスをしてください
少し教えてください。プライベート変数とパブリックアクセス関数(getterとsetter)を追加する必要があります。 ここでは何をしなければならないのですか?クラスのpublic変数を定義してください。それは大丈夫ですか? –
実際これはより良い方法です。しかし、playersDataデータがいつ変更されるかを知る必要があります。私はBindableにすることでこれを行います。あなたはゲッターをバインド可能にすることができますが、それは例を多く複雑にしています。しかしゲッターやセッターでそれをする方が良いです。 – Arno
もう1つ: 私はこの行に問題があることに気づきました: playersData = event.result.players.player; ここでArrayCollectionを作成する方が正しいと思われますか?例: playersData = ArrayCollection(event.result.players.player); しかし、このコードは動作しません(アレイコレクションを配列に変換できないというエラーが発生します....)なぜですか? –