2011-09-14 11 views
0

OK、以下は私が行う必要がある簡単な例です。labelFunctionとsortCompareFunctionとFlexの大きなデータセット

これまでのところとてもうまくいっています。 IDはフレンド名で置き換えられ、列はソート可能です。

ここでは、これを数千のIDと数千の行を含むシステムに適用する必要があります。

私がどうなるか...クライアントにこのような何かを提供することは不可能、それはとても遅いです、

をそれとwoooooooooooを試してみました、あなたの意見では、同じ目標を達成するための最善のアプローチ?

私が持っていただけのアイデアではなく、あまりにも文字列として名を格納するために、DB内の唯一のIDを格納するのである...私はただの事、それは私が保管する必要はありません情報です...

誰もがアイデアを持っていますか? fId.labelFunction(obj1、fId)を各行に呼び出す代わりに、レンダリングされた文字列を並べ替える別の方法はありますか?

ありがとうございました!

<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
xmlns:s="library://ns.adobe.com/flex/spark" 
xmlns:mx="library://ns.adobe.com/flex/mx"> 
<fx:Script> 
    <![CDATA[ 
     import mx.collections.ArrayCollection; 
     import mx.events.FlexEvent; 

     [Bindable] 
     private var _friendList:ArrayCollection = new ArrayCollection([ 
      {friend_id : 1}, 
      {friend_id : 3}, 
      {friend_id : 2}, 
      {friend_id : 2}, 
      {friend_id : 1}, 
      {friend_id : 2}, 
      {friend_id : 1}, 
      {friend_id : 3} 
     ]); 

     private function friendNameFromID(item:Object, column:DataGridColumn):String 
     { 
      var id:int = item[column.dataField]; 

      if (id == 1) 
       return "Thomas"; 

      if (id == 2) 
       return "Anthony"; 

      if (id == 3) 
       return "George" 

      return ""; 
     } 

     private function sortFromFriendName(obj1:Object, obj2:Object):int 
     { 
      var value1:String = fId.labelFunction(obj1, fId); 
      var value2:String = fId.labelFunction(obj2, fId); 

      if (value1 == value2) 
       return 0; 
      else if (value1 > value2) 
       return 1; 
      else 
       return -1; 
     } 

    ]]> 
</fx:Script> 

<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 

<mx:DataGrid id="myDataGrid" dataProvider="{_friendList}" width="90%" height="90%" horizontalCenter="0" verticalCenter="0"> 
    <mx:columns> 
     <mx:DataGridColumn dataField="friend_id"/> 
     <mx:DataGridColumn id="fId" dataField="friend_id" labelFunction="friendNameFromID" sortCompareFunction="sortFromFriendName"/> 
    </mx:columns> 
</mx:DataGrid> 

答えて

1

の代わりに(..)は、uは値としてキー名としてIDを設定、Dictionaryオブジェクトを使用してみましたがある場合の束をやって?私が誤解されていない場合、辞書へのアクセスはハッシュ関数を使って行われ、一連のif文よりもはるかに高速です。

<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
xmlns:s="library://ns.adobe.com/flex/spark" 
xmlns:mx="library://ns.adobe.com/flex/mx" 
initialize="buildNameDictionary()" 
> 
<fx:Script> 
    <![CDATA[ 
     import mx.collections.ArrayCollection; 
     import mx.events.FlexEvent; 

     private var nameDictionary:Dictionary; 

     [Bindable] 
     private var _friendList:ArrayCollection = new ArrayCollection([ 
      {friend_id : 1}, 
      {friend_id : 3}, 
      {friend_id : 2}, 
      {friend_id : 2}, 
      {friend_id : 1}, 
      {friend_id : 2}, 
      {friend_id : 1}, 
      {friend_id : 3} 
     ]); 

     private function buildNameDictionary():void 
     { 
      nameDictionary= new Dictionary(); 
      nameDictionary[1] = "Thomas"; 
      nameDictionary[2] = "Anthony"; 
      nameDictionary[3] = "George"; 
     } 

     private function friendNameFromID(item:Object, column:DataGridColumn):String 
     { 
      if(nameDictionary[item]) 
       return nameDictionary[item] as String 

      return ""; 
     } 

     private function sortFromFriendName(obj1:Object, obj2:Object):int 
     { 
      var value1:String = fId.labelFunction(obj1, fId); 
      var value2:String = fId.labelFunction(obj2, fId); 

      if (value1 == value2) 
       return 0; 
      else if (value1 > value2) 
       return 1; 
      else 
       return -1; 
     } 

    ]]> 
</fx:Script> 

<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 

<mx:DataGrid id="myDataGrid" dataProvider="{_friendList}" width="90%" height="90%" horizontalCenter="0" verticalCenter="0"> 
    <mx:columns> 
     <mx:DataGridColumn dataField="friend_id"/> 
     <mx:DataGridColumn id="fId" dataField="friend_id" labelFunction="friendNameFromID" sortCompareFunction="sortFromFriendName"/> 
    </mx:columns> 
</mx:DataGrid> 
+0

場合(..)ステートメントは、単に簡略化、作業例を持っていることです。実際のシステムでは、自分のDBにクエリを送り、その名前をObjectに格納します。次に、私のlabelFunctionは名前とIDを関連付けます。しかし、私はdictionnayオブジェクトを見て、あなたの投稿を保ちます。ありがとう! – Jivago

+0

Dicionaryを使用して結果をキャッシュできます。 nameDictionaryに存在しない場合はDBを要求し、そうでない場合は格納された値を使用する – Exort

2

データのページングは​​どうですか?あなたの頭痛だけでなく、それらの行のすべての束をフィルタリングする。ユーザーはまた文句を言うことができます;)

は、ここで私は例として見つけただけで最初のものです:Advanced Paging and Filtering in Flex Datagrid

関連する問題