2011-09-14 3 views
0

OK, voici un exemple simplifié de ce que je dois faire.labelFunction et sortCompareFunction et grands ensembles de données dans Flex

Jusqu'ici tout va bien, fonctionne A1. Les ID sont remplacés par le nom de l'ami et la colonne est triable.

Maintenant, je dois l'appliquer à un système contenant des milliers d'ID et des milliers de lignes.

Je l'ai essayé et wooooooooooo, il est si lent, impossible de livrer quelque chose comme ça à un client ...

Quelle serait, à votre avis, la meilleure approche pour atteindre le même objectif?

La seule idée que je HAD au lieu de stocker uniquement l'ID dans le DB, pour stocker les noms sous forme de chaînes trop ... Je chose que ce sont des informations que je ne devrais pas avoir à stocker ...

Quelqu'un a une idée? Une autre façon de trier la chaîne rendue au lieu de devoir rappeler la fId.labelFunction (obj1, fId) sur chaque ligne?

MERCI BEAUCOUP!

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

Répondre

1

Au lieu de faire un tas de si (..) ont u essayé d'utiliser un objet Dictionary, réglage de l'identifiant comme la clé et le nom de la valeur? Si je ne me trompe pas, l'accès à un dictionnaire est fait en utilisant une fonction de hachage et est beaucoup plus rapide qu'une série d'instructions 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 (..) déclaration est juste d'avoir une procédure simplifiée, par exemple de travail. Dans le système réel, j'envoie une requête à ma base de données et stocke les noms dans un objet. Ensuite, mon labelFunction associe les noms et les ID. Mais je vais jeter un oeil à l'objet dictionnay et vous tenir au courant. Merci! – Jivago

+0

Vous pouvez utiliser le Dicionary pour mettre en cache les résultats. S'il n'est pas présent dans nameDictionary, demandez DB, sinon utilisez la valeur stockée – Exort

2

Qu'en est-il de la pagination de vos données? Ce n'est pas seulement votre mal de tête de filtrer toutes ces rangées de lignes. L'utilisateur peut également se plaindre;)

Voici juste une première chose que j'ai trouvé comme par exemple: Advanced Paging and Filtering in Flex Datagrid

Questions connexes