2009-07-21 6 views
0

私は最初のフレックスアプリケーションを試しています。 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; 
     } 

    } 
} 

問題は何もデータグリッドに示されていないということです

私はちょうど初心者なので、私はクラスで間違っていたアドバイスをしてください

答えて

2

結果関数(ListOfPlayersクラス)​​は、Webサービスを呼び出す関数ではなく、プレーヤーのリストを与える必要があります。あなたは何ができるか

は、サーバ・クラスでこれを追加することです:

[Bindable] 
public var playersData:ArrayCollection; 

とあなたのビューでは、バインド可能なタグでも、この変数を追加して、値が(メインに次の行を追加設定): playersDataの=ユーザー.playersData;

次いで、データグリッドのdataProviderは "{playersData}は"

これが動作するはずです。しかし、XMLのリストでは、あなたがツリーにどれくらい深くいるかを知るのは少し難しいです;)

+0

少し教えてください。プライベート変数とパブリックアクセス関数(getterとsetter)を追加する必要があります。 ここでは何をしなければならないのですか?クラスのpublic変数を定義してください。それは大丈夫ですか? –

+0

実際これはより良い方法です。しかし、playersDataデータがいつ変更されるかを知る必要があります。私はBindableにすることでこれを行います。あなたはゲッターをバインド可能にすることができますが、それは例を多く複雑にしています。しかしゲッターやセッターでそれをする方が良いです。 – Arno

+0

もう1つ: 私はこの行に問題があることに気づきました: playersData = event.result.players.player; ここでArrayCollectionを作成する方が正しいと思われますか?例: playersData = ArrayCollection(event.result.players.player); しかし、このコードは動作しません(アレイコレクションを配列に変換できないというエラーが発生します....)なぜですか? –

関連する問題