Primefaces 10+ Datatable如何从SortEvent获取排序列?

问题描述 投票:0回答:2

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

在迁移指南 8.0 -> 10.0.0 中,DataTable 下的重大更改如下:

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

我一生都无法弄清楚如何将正在排序的列作为值表达式传递。

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

<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 backing bean 方法:

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

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

<p:ajax event="sort" listener="#{nameBackingBean.sortedColumnSelected(el expression telling me what column was sorted)}" />

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

java sorting jsf primefaces primefaces-datatable
2个回答
3
投票

当然,在我发布这篇文章后,我想我已经明白了。

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

这是我的示例代码:

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
        }

希望这对其他人有帮助。如果您知道执行此操作的不同方法,我很想听听。

谢谢大家!


0
投票

正如 Chris 先生已经说过的,有 DataTable#getActiveSortMeta
这也可以用于:

<p:ajax event="sort" listener="#{managedBean.onSort}" />

还有一些名为“managementBean”的 Bean:

public void onSort(SortEvent event) {
    var tbl = (DataTable) event.getSource();
    var activeSort = tbl.getActiveSortMeta();
    // ... whatever
}
© www.soinside.com 2019 - 2024. All rights reserved.