我们目前正在使用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后台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)}" />如果有人知道如何格式化值表达式来告诉我哪一列是排序的,我会非常感激的!
发布于 2022-11-23 22:20:15
当然,在我发完这篇文章之后,我想我想明白了。
看起来,在getActiveSortMeta中有一个名为DataTable的方法,它似乎保存了正在排序的列。地图中的关键是被排序的字段。我的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
}希望这能帮到别人。如果你知道一种不同的方法,我很想听听。
谢谢大家!
https://stackoverflow.com/questions/74552212
复制相似问题