2011-09-14 21 views
0

好的,下面是我必須做的一個簡化示例。Flex中的函數和sortCompareFunction和大型數據集

到目前爲止好,工程A1。 ID由朋友名稱替換,並且該列可排序。

現在,我必須將其應用於包含數千個ID和數千行的系統。

我嘗試過了,wooooooooooo,它是如此之慢,無法提供像這樣的客戶端...

會是什麼,在你看來,最好的方法來達到同樣的目標是什麼?

唯一的想法我是不是隻存儲在數據庫中的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嘗試使用Dictionary對象,設置id爲鍵和名稱作爲價值?如果我沒有弄錯,訪問一個字典是使用散列函數完成的,並且比一系列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

的IF(..)語句,只是有一個簡單,工作示例。在真實的系統中,我向我的數據庫發送查詢,並將名稱存儲在對象中。然後,我的labelFunction將名稱和ID關聯起來。但我會看看dictionnay對象,並保持發佈。謝謝! – Jivago

+0

您可以使用Dicionary來緩存結果。如果不存在於nameDictionary中,則請求DB,否則使用存儲值 – Exort