【问题标题】:Sorting a CellTable server-side对 CellTable 服务器端进行排序
【发布时间】:2011-11-08 11:55:11
【问题描述】:

我目前正在使用 Gwt CellTable,通过 RPC 调用绑定到我的 GAE/Objectify 后端。

现在好了! :-)

然后我想对列进行排序,所以我阅读了http://code.google.com/intl/it-IT/webtoolkit/doc/latest/DevGuideUiCellTable.html#columnSorting

异步远程排序部分很好地展示了如何对我的 AsyncDataProvider 进行排序,但是...如何检索用户想要排序的列名称

显示此代码:ColumnSortList sortList = table.getColumnSortList();

但是我怎样才能从中获取字符串名称呢?我只是想知道“surname”或“soldDate”,列绑定的字段的名称!然后我会将它传递给我的 rpc 服务,并使用它来排序数据服务器端query(...).order(<field_name>)

我错过了什么吗?

UPD:这里有有趣的东西:http://groups.google.com/group/google-web-toolkit/browse_thread/thread/77a0eaf8086218a6/effb8d3abe69270b#effb8d3abe69270b

【问题讨论】:

    标签: google-app-engine gwt cell objectify


    【解决方案1】:

    您可以保持列名列表在表中的顺序:

    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 是您在单元格表中显示的数据对象。

    【讨论】:

      【解决方案2】:

      我使用过这样的东西作为应用程序列对象。

      公共类 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();
      

      【讨论】:

        【解决方案3】:

        正确的方法是扩展基列类,这将允许您覆盖单元格渲染,通过构造函数传入列配置,最重要的是设置 DataStoreName,您应该在其中存储列的字段名称。最后,您不应该重用 onrangechanged 火,而是通过覆盖它直接访问 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 方法。

        现在您不需要为字符串名称存储单独的列表,如果列顺序因用户交互或其他原因发生变化,这会浪费内存,更不用说同步问题了。

        【讨论】:

          【解决方案4】:

          聚会有点晚了,但这里有一个基于 current documentation 的更直接的解决方案(请参阅“使用 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 方法。它甚至允许我们使用与 UI/客户端使用的列名不同的名称(例如数据库列名)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-06-17
            • 1970-01-01
            • 2020-04-28
            • 2019-06-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-21
            相关资源
            最近更新 更多