我们目前使用的是 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)}" />
如果有人知道如何格式化值表达式来告诉我哪一列已排序,我将非常感激!
当然,在我发布这篇文章后,我想我已经明白了。
看起来 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
}
希望这对其他人有帮助。如果您知道执行此操作的不同方法,我很想听听。
谢谢大家!
正如 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
}