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

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

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

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


person Felipe    schedule 22.02.2010    source источник


Ответы (4)


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

Шаги:

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

  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 проходить через "страницу" и оставить все как есть ... так что он счастлив, и вы счастливы, потому что у вас есть значки ...

person jbell    schedule 27.04.2010
comment
Я использовал другой подход для фиктивной сортировки на стороне Flex: я использую preventDefault в своей функции обработчика. Поскольку у меня уже есть локальная карта столбцов сортировки, я применяю ту же сортировку вручную к своему dataProvider после получения данных с сервера. Я расширил класс Sort и переопределил функцию sort (), поэтому просто ничего не делаю и возвращаюсь. Я использую этот класс DummySort в своем провайдере данных. - person Akshay; 20.04.2012

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

person Ryan Guill    schedule 22.02.2010
comment
точно, я хочу выполнить сортировку на стороне сервера, но я не знаю, какой метод должен быть перезаписан, прямо сейчас я пытаюсь реализовать метод sort (), но я не уверен, что это лучший способ сделать это, я уже пытался переопределить событие щелчка над заголовком datagrid без хорошего результата. - person Felipe; 22.02.2010
comment
Я не уверен, что вы понимаете, что я имею в виду под серверной частью. На каком языке вы подключаетесь для получения данных? Независимо от того, что это такое, используете ли вы sql для извлечения данных, которые нужно предоставить для гибкости? Если да, поставьте туда свой сорт. Методы переопределения в flex не имеют никакого отношения к стороне сервера. - person Ryan Guill; 22.02.2010
comment
Как вы реализовали такую ​​сортировку в AdvancedDataGrid? - person Jarno Lahtinen; 19.11.2012

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

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

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

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

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

Я надеюсь, что это поможет вам!

person countcb    schedule 23.02.2010
comment
Спасибо за ответ countcb, я пытался избежать визуальных уловок (подключение события щелчка мыши и тому подобного) в основном потому, что это не позволяло мне использовать почти стандартную сетку. - person Felipe; 02.03.2010

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

Я расширил класс 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();
    }
}

}

person Felipe    schedule 02.03.2010
comment
Пробовал и это тоже. Как-то поля сортировки пустые. - person Jarno Lahtinen; 27.03.2012