首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >10+数据表如何从SortEvent中获得排序列?

10+数据表如何从SortEvent中获得排序列?
EN

Stack Overflow用户
提问于 2022-11-23 19:41:46
回答 1查看 23关注 0票数 1

我们目前正在使用Primefaces版本8,我正在努力将我们迁移到版本12。

在迁移指南8.0 -> 10.0.0中,在DataTable下,打破更改说明如下:

SortEvent:已排序的数据表值不再传递给此事件,而是通过托管bean获得排序的值(例如,用作值表达式的YourBean#list )。

在我的生活中,我不知道如何将列作为值表达式进行排序。

下面是我们目前使用Primefaces 8(简化)所做的工作:

代码语言:javascript
复制
<p:dataTable id="searchResultsTable" 
    value="#{nameBackingBean.queryResults}"
    var="searchResultsRow" widgetVar="tableWidget"
    sortBy="#{searchResultsRow.name}" sortOrder="ascending">
    
    <p:ajax event="sort" listener="#{nameBackingBean.sortedColumnSelected}" />
    
    <!-- Name -->
    <p:column headerText="Name"
        sortBy="#{searchResultsRow.name}">
        <h:outputText id="nameValue"
            value="#{searchResultsRow.name}" />
    </p:column>
    
    <!-- Age -->
    <p:column headerText="Age"
        sortBy="#{searchResultsRow.age}">
        <h:outputText id="ageValue"
            value="#{searchResultsRow.age}" />
    </p:column>
    
    ...

下面是执行排序时调用的java后台bean方法:

代码语言:javascript
复制
  public void sortedColumnSelected(AjaxBehaviorEvent event){
      if (null != event.getSource()){
         DataTable table = (DataTable) event.getSource();
         if(table != null && table.getSortColumn() != null){
            String headerText = table.getSortColumn().getHeaderText();
            String sortOrder = table.getSortOrder();
            
            if(headerText.equals("Name")){
               //we do something
            }else if (headerText.equals("Age")){
               //we do something else
            ...

getSortColumn方法在Primefaces 8之后不再可用,因此我假设我必须使用一些EL表达式来确定哪一列被排序(基于句子,例如,用作值表达式的YourBean#list ),并像这样传递值.

代码语言:javascript
复制
<p:ajax event="sort" listener="#{nameBackingBean.sortedColumnSelected(el expression telling me what column was sorted)}" />

如果有人知道如何格式化值表达式来告诉我哪一列是排序的,我会非常感激的!

EN

回答 1

Stack Overflow用户

发布于 2022-11-23 22:20:15

当然,在我发完这篇文章之后,我想我想明白了。

看起来,在getActiveSortMeta中有一个名为DataTable的方法,它似乎保存了正在排序的列。地图中的关键是被排序的字段。我的DataTable一次只允许对一个列进行排序,因此映射只包含一个条目。

下面是我的示例代码:

代码语言:javascript
复制
public void sortedColumnSelected(AjaxBehaviorEvent event) {
  if (null != event.getSource()) {
     DataTable table = (DataTable) event.getSource();
     
     /* This map should contain the column that is being sorted. Since only
      * one column can be sorted at a time, there should only be one. */
     Map <String, SortMeta> sortMap = table.getActiveSortMeta();

     if (MapUtils.isNotEmpty(sortMap)) {
     
        String fieldName = sortMap.keySet().iterator().next();

        SortMeta meta = sortMap.get(fieldName);
        String sortOrder = meta.getOrder().name();

        /* set the sort order so the report can display correctly. */
        setSortAscending(sortOrder.equals("ASCENDING"));

        if (fieldName.equals("name")) {
          //do something
        } else if (fieldName.equals("age")) {
          //do something else
        }

希望这能帮到别人。如果你知道一种不同的方法,我很想听听。

谢谢大家!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74552212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档