Гибкие возможности пользовательской сортировки с поддержкой на стороне сервера - PullRequest
1 голос
/ 22 февраля 2010

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

Все это для возможности сортировки на стороне сервера.

Кто-нибудь сталкивался с такой проблемой?

Ответы [ 4 ]

2 голосов
/ 27 апреля 2010

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

Шаги:

  1. использовать событие headerRelease объекта DataGrid для перехвата запроса "sort".

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

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

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

на этом этапе Flex также хочет отсортировать данные ... (если вы не предотвращаетеDefault () событие headerRelease) ... чтобы позволить Flex "сортировать" данные, ничего не путая, и чтобы направление Иконки продолжают функционировать нормально, вы можете:

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

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

public function doNothingSort( a:Object, b:Object ):int {
    if( weAreCurrentlyInAscendingDirection )
        return ObjectUtil.numericCompare( a.new, b.num );
    else
        return ObjectUtil.numericCompare( b.num, a.num );
}

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

0 голосов
/ 23 февраля 2010

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

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

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

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

<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 голосов
/ 02 марта 2010

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

Я расширил класс ArrayCollection и переопределил метод сортировки set / get и refresh

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 голосов
/ 22 февраля 2010

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

...