Flex пользовательские возможности сортировки с серверной поддержкой

Возможности сортировки, которые доступны в Flex, предполагают, что у Вас есть доступ ко всем данным, но я использую нумеровавший страницы datagrid (с пользовательским кодом), datagrid связывается с экземпляром ArrayCollection, на вызове следующей страницы я изменяю данные dataprovider, и все работает хорошо, но для сортировки я должен переопределить щелчок, или событие лучше переопределяют метод сортировки arraycollection

Все это должно смочь сделать сортировку серверной стороны.

Кто-либо столкнулся с этим видом проблемы?

1
задан Felipe 22 February 2010 в 16:54
поделиться

4 ответа

Я не уверен, что правильно понимаю вопрос, но похоже, что вам нужно выполнять сортировку на стороне сервера. Если у вас нет всех данных, загруженных в гибкое приложение, вы не сможете их отсортировать.

0
ответ дан 3 September 2019 в 01:11
поделиться

Я понял проблему так:

В flex-клиенте у него часть всех данных. Поскольку клиент не знает всех данных, сортировка не может быть сделана на стороне клиента. У него уже работает сортировка на стороне сервера.

Теперь ему нужно сделать следующее: Когда пользователь нажимает на заголовок таблицы данных, он хочет сделать вызов сервера и получить отсортированные данные обратно. Поведение по умолчанию при нажатии на заголовок грида заключается в том, что данные сортируются на стороне клиента. Вот почему ему нужно сделать что-то на стороне клиента.

Единственное, что я нашел, это следующее:

<mx:DataGrid xmlns:mx="http://www.adobe.com/2006/mxml"
headerRelease="onHeaderRelease(event)">

Указанная функция onHeaderRelease вызывается, как только кнопка мыши на заголовке была нажата (кнопка мыши была отпущена снова).

Пример функции. Возможно, вы сможете взять отсюда

        public function onHeaderRelease(evt:DataGridEvent):void
        {
            var grd:DataGrid = DataGrid(evt.currentTarget);
            Alert.show(evt.columnIndex + " : " + (DataGridColumn)(grd.columns[evt.columnIndex]).sortDescending, "ColumnIndex : Sorted Descending?");
            // do the server called and get the sorted array back
        }

Надеюсь, это вам поможет!

0
ответ дан 3 September 2019 в 01:11
поделиться

Я реализовал следующее решение, которое на данный момент работает довольно хорошо, но, вероятно, есть улучшения, которые можно внести.

Я расширил класс ArrayCollection и переопределил методы установки / получения и обновления сортировки

package custom
{
import mx.collections.ArrayCollection;
import mx.collections.Sort;

/**
 *  Dispatched when a sort is required
 *
 *  @eventType custom.PaginatedCollectionEvent.SORT
 */
[Event(name="sort" , type="custom.PaginatedCollectionEvent")]

public class PaginatedCollection extends ArrayCollection
{
    private var _sort:Sort;

    public function PaginatedCollection(source:Array=null)
    {
        super(source);
    }

    public function setDefaultSort (s:Sort):void
    {
        _sort = s;
    }


    override public function set sort(s:Sort):void
    {
        _sort = s;
        if (!s)
            return;

        var event:PaginatedCollectionEvent = new PaginatedCollectionEvent(PaginatedCollectionEvent.SORT);
        event.fields = s.fields;
        event.s = s;
        this.dispatchEvent(event);
    }

    override public function get sort():Sort
    {
        return _sort;
    }

    /**
     * Avoid the internal sorting implementation, with this it's possible
     * to do a server side sort.
     *
     * @return true
     */
    override public function refresh():Boolean
    {
        return true;
    }

    /**
     * Wrapper for ArrayCollection refesh implementation
     */
    public function superRefresh():Boolean
    {
        return super.refresh();
    }
}

}

0
ответ дан 3 September 2019 в 01:11
поделиться

Вот шаги, которые я использовал для решения этой проблемы ... Хорошая вещь в этом решении заключается в том, что я могу позволить Flex "сортировать" вместе со мной, что позволяет отображать значки направления сортировки на DataGrid.

Шаги:

  1. используйте событие headerRelease DataGrid для перехвата запроса «сортировки».

  2. сохранить локальную карту столбцов и их текущие направления сортировки ... это имитация того, что flex делает при сортировке ... поэтому все столбцы начинаются с "восходящего", а затем направление переключается только тогда, когда по заданному столбцу дважды подряд щелкают. это, вероятно, можно было бы сделать, наблюдая за внутренними структурами гибкости, но я не стал пробовать это.

  3. событие headerRelease использует запрошенный столбец из своего события вместе с предыдущим запрошенным столбцом и картой направлений сортировки текущего столбца, чтобы решить, следует ли обновлять направление сортировки на локальной карте.

  4. обращается к серверу, чтобы получить должным образом отсортированную страницу данных.

на этом этапе Flex также хочет отсортировать данные ... (если вы не предотвратитеDefault () событие headerRelease) ... чтобы позволить Flex «сортировать» данные без каких-либо проблем, и чтобы направление значки продолжают работать должным образом, вы можете:

  1. добавить поле «идентификатор строки» к вашему набору результатов SQL на сервере, которое представляет собой просто счетчик для каждой последовательной строки в наборе результатов после того, как он был отсортирован и разбит на страницы .. .Этот идентификатор всегда будет восходящим, независимо от того, какое направление сортировки применяется.

  2. установите sortCompareFunction в DataGridColumns на «фиктивную» сортировку, которая использует этот идентификатор строки ... как таковой:

 публичная функция doNothingSort (a: Object, b: Object): int {
if (weAreCurrentlyInAscendingDirection) 
return ObjectUtil.numericCompare (a.new, b.num); 
else 
return ObjectUtil.numericCompare (b.num, a.num); {{1 }}} 
 

Это позволит Flex перемещаться по "странице" и оставить все как есть ... так что он счастлив, и вы счастливы, потому что у вас есть значки ...

{ {1}}
2
ответ дан 3 September 2019 в 01:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: