Сортировка CellTable на стороне сервера - PullRequest
1 голос
/ 01 сентября 2011

В настоящее время я использую Gwt CellTable, привязанную к моему бэкэнду GAE / Objectify через вызовы RPC.

Все прямо сейчас!: -)

Затем я хочу отсортировать столбцы, поэтому я читаю http://code.google.com/intl/it-IT/webtoolkit/doc/latest/DevGuideUiCellTable.html#columnSorting

Разделы удаленной сортировки Async очень хорошо показывают, как выполнить сортировку в моем AsyncDataProvider, но ...как я могу получить имя столбца , который пользователь хочет отсортировать?

Он показывает этот код: ColumnSortList sortList = table.getColumnSortList();

Но как я могу получить имена строк из этого?Я просто хочу знать "фамилию" или "soldDate", имя поля, к которому привязан столбец!Затем я передам его моей службе rpc и использую его для сортировки данных на стороне сервера query(...).order(<field_name>)

Я что-то упустил?

UPD : интересные вещи здесь: http://groups.google.com/group/google-web-toolkit/browse_thread/thread/77a0eaf8086218a6/effb8d3abe69270b#effb8d3abe69270b

Ответы [ 4 ]

5 голосов
/ 01 сентября 2011

Вы можете сохранить список имен столбцов в том порядке, в котором они указаны в таблице:

List<String> columnNames = new ArrayList<String>();

table.addColumn(surnameColumn, "surname");
columnNames.add("surname");

// add the other columns

Тогда, когда вам нужно получить имя столбца сортировки:

String sortColumnName;
ColumnSortList sortList = table.getColumnSortList();
if (sortList != null && sortList.size() != 0){
     Column <MyEntity, ?> sortColumn = (Column <MyEntity, ?>) 
                                           sortList.get(0).getColumn();
     Integer columnIndex = table.getColumnIndex(sortColumn);
     sortColumnName = columnNames.get(columnIndex);
}

// do your rpc call

* где MyEntity - ваш объект данных, отображаемый в таблице ячеек.

1 голос
/ 20 июня 2018

Немного опоздал на вечеринку, но вот более простое решение, основанное на текущей документации (см. Раздел «ColumnSorting with AsyncDataProvider»).

Когда мыдобавив наши столбцы, мы можем просто установить dataStoreName:

TextColumn<MyData> surname = new TextColumn<MyData>() {
    ...
}
surname.setSortable(true);
surname.setDataStoreName("surname");  // Set the column name
table.getColumnSortList().push(surname);
table.addColumn(surname, "Last Name");  // eg. A different name for the UI

Затем мы можем получить столбец dataStoreName позже при сортировке:

@Override
protected void onRangedChanged(HasData<MyData> display) {
    ...
    ColumnSortList.ColumnSortInfo info = table.getColumnSortList().get(0);
    String sortColumn = info.getColumn().getDataStoreName();  // Get the column name
    boolean sortIsAscending = info.isAscending();

    rpcService.requestMyData(
        sortColumn,
        sortIsAscending,
        new AsyncCallback<ArrayList<MyData>>() {...}
    );
    ...
}

Используя этот метод, мы можем передатьимя столбца прямо к нашему методу RPC.Это даже позволяет нам использовать другое имя (например, имя столбца базы данных), чем имя столбца, используемое на пользовательском интерфейсе / стороне клиента.

0 голосов
/ 13 августа 2012

Надлежащим способом является расширение базового класса столбца, который позволит вам переопределить рендеринг ячейки, передать конфигурацию столбца через конструктор и, что наиболее важно, установить DataStoreName, в котором вы должны хранить имя поля для столбца. И, наконец, вы не должны повторно использовать переставленный огонь, а обращаться к обработчику columnsort напрямую, переопределяя его. при изменении диапазона и обработчике сортировки столбцов следует вызывать некоторый тип метода, который вы должны обновить свою сетку. Я называю мой updateGrid для здравомыслия. Это позволяет вам установить любые параметры сетки, используемые вашим асинхронным запросом, для определенного столбца сортировки и направления. Основная причина, по которой вы хотите использовать обработчик сортировки столбцов, - это обращение к событию ColumnSort, которое содержит информацию о вашем направлении сортировки

ваш класс столбцов, который расширяет базовый столбец GWT. Вы также можете расширить столбцы даты или числа.

public GridStringColumn(String fieldName, String text, String tooltip, boolean defaultShown, boolean sortable, boolean hidden) {
        super(new TextCell());
        setDataStoreName(fieldName);
        this.text_ = text;
        this.tooltip_ = tooltip;
        this.defaultShown_ = defaultShown;
        setSortable(sortable);
        this.hidden_ = hidden;
    }

создай свой обработчик

dataGrid.addColumnSortHandler(new DataGridSortEvent());

класс событий вашего рода

protected class DataGridSortEvent implements ColumnSortEvent.Handler {

        @Override
        public void onColumnSort(ColumnSortEvent event) {
            ColumnSortList sortList = dataGrid_.getColumnSortList();
            if (sortList != null && sortList.size() > 0) {
                Column<T, ?> sortColumn = (Column<T, ?>) sortList.get(0).getColumn();
                LOG.info("col_sorta: " + event.isSortAscending());
                LOG.info("col_index: " + sortColumn.getDataStoreName());
                updateDataList();
            }
        }
    }

updateDataList - это ваш метод, который вы используете для отправки фактического AJAX-запроса на сервер. вместо того, чтобы регистрировать, вы должны хранить эту информацию в частных членах вашего класса данных, чтобы ваш запрос мог их параметризировать.

Вы также можете сделать это для локального кэширования, просто сделайте копию данных с вашего сервера локально, затем верните отсортированную коллекцию этой кэшированной коллекции, вместо вызова метода updateDataList.

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

0 голосов
/ 15 июня 2012

Я использовал что-то подобное в качестве объекта столбца приложения.

открытый класс ScrollTableColumn {

    // --------------------------------------------------------------- Field(s)

    private int            sequence;
    private Column         column;
    private Header         header;
    private int            size;
    private int            calculatedSize;
    private boolean        show;
    private PartialColumn  partialColumn;
    private ColumnNameEnum columnName;

}

Теперь создайте описанную выше HashMap следующим образом:

Map<Column, ScrollTableColumn> columnMap 
    = new HashMap<Column, ScrollTableColumn>();

Добавьте все столбцы по мере их создания как в ScrollTableColumn, так и в columnMap.

Наконец, вы можете получить требуемое имя как:

ColumnSortList sortList = dataTable.getColumnSortList();
Column<?, ?> column = sortList.get(0).getColumn();
ColumnNameEnum = columnMap.get(column);
String name = ColumnNameEnum.getName();
...