В настоящее время мы используем Primefaces версии 8, и я работаю над переходом на версию 12.
В руководстве по миграции 8.0 -> 10.0.0 в разделе DataTable критические изменения говорят следующее:
SortEvent: этому событию больше не передается отсортированное значение таблицы данных, вместо этого получите отсортированное значение через управляемый компонент (например, 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, который вызывается при выполнении сортировки:
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
}
Надеюсь, это поможет кому-то еще. Если вы знаете другой способ сделать это, я хотел бы услышать об этом.
Спасибо всем!