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



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

在迁移指南8.0 ->10.0.0,在DataTable下,Breaking changes是这样写的:

SortEvent:已排序的数据表值不再传递给该事件。相反,通过您的托管bean(例如

对于我的生命,我不知道如何传递被排序的列作为一个值表达式。

以下是我们目前使用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
...

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

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

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

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

看起来在DataTable中有一个方法叫做getActiveSortMeta它似乎保存了正在排序的列。映射中的键是要排序的字段。My 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
}

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

谢谢!

最新更新