labelFunction и sortCompareFunction и большие наборы данных во Flex
Хорошо, ниже приведен упрощенный пример того, что я должен сделать.
Пока все хорошо, работает А1. Идентификаторы заменяются именем друга, и столбец можно сортировать.
Теперь я должен применить это к системе, содержащей тысячи идентификаторов и тысячи строк.
Я попробовал и wooooooooooo, это так медленно, невозможно доставить что-то подобное клиенту...
Какой, по вашему мнению, лучший подход для достижения той же цели?
Единственная идея, которая у меня возникла - вместо того, чтобы хранить только идентификатор в БД, хранить имена в виде строк тоже... Я просто считаю, что это информация, которую мне не нужно было хранить...
У кого-нибудь есть идея? Другой способ сортировки отображаемой строки вместо необходимости вызывать функцию 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>
2 ответа
Вместо того, чтобы делать кучу if(..), вы пытались использовать объект 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>
Как насчет подкачки ваших данных? Это не только ваша головная боль, чтобы отфильтровать все эти ряды строк. Пользователь также может пожаловаться;)
Вот только первое, что я нашел в качестве примера: расширенные функции подкачки и фильтрации в Flex Datagrid