Сортировка не работает в datatable в PrimeFaces?
Сортировка не работает в datatable в PrimeFaces. Пожалуйста, предложите.
См. ниже мой .xhtml файл
<h:form>
<p:dataTable style="width: 60%" id="dt1" value="#{bean.list}" var="entry" first="0" paginator="true" rows="10" paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" rowsPerPageTemplate="5,10,15" emptyMessage="No cars found with given criteria" >
<f:facet name="header">
<h2>Cars View</h2>
</f:facet>
<p:column sortBy="#{entry.carno}" filterBy="#{entry.carno}">
<f:facet name="header">
<h:outputText value="Car Number" />
</f:facet>
<h:outputText value="#{entry.carno}"></h:outputText>
</p:column>
<p:column sortBy="#{entry.carsettings['car-model']}" filterBy="#{entry.carsettings['car-model']}">
<f:facet name="header">
<h:outputText value="Car Model"/>
</f:facet>
<h:outputText value="#{entry.carsettings['car-model']}"></h:outputText>
</p:column>
<p:column sortBy="#{entry.carsettings.year}" filterBy="#{entry.carsettings.year}">
<f:facet name="header">
<h:outputText value="Car Year"/>
</f:facet>
<h:outputText value="#{entry.carsettings.year}"></h:outputText>
</p:column>
<p:column sortBy="#{entry.carsettings.color}" filterBy="#{entry.carsettings.color}">
<f:facet name="header">
<h:outputText value="Car Color"/>
</f:facet>
<h:outputText value="#{entry.carsettings.color}"></h:outputText>
</p:column>
</p:dataTable>
</h:form>
@Sean
Посмотрите ниже код
Список автомобилей
<ui:composition template="/template.xhtml">
<ui:define name="content">
<f:view>
<f:event type="preRenderView" listener="#{MyBackingBean.load}"></f:event>
<center>
<h1>Car View</h1>
<h:outputText value="No data found" style="font-size: 15px;font-family: Arial, Verdana,Helvetica, sans-serif" rendered="#{MyBackingBean.noDataExist}"></h:outputText>
<h:form id="dataform1">
<p:dataTable var="item" value="#{MyBackingBean.dataList}" dynamic="true" paginator="true" rows="2" id="table" style="width:60%"
rendered="#{!MyBackingBean.noDataExist}" >
<p:column sortBy="#{item.id}" filterBy="#{item.id}">
<f:facet name="header">
<h:outputText value="ID" />
</f:facet>
<h:outputText value="#{item.id}" />
</p:column>
<p:column sortBy="#{item.carsettings['car-color']}" filterBy="#{item.carsettings['car-color']}">
<f:facet name="header">
<h:outputText value="Color" />
</f:facet>
<h:outputLink target="_blank" value="http://#{item.carsettings['car-color']}">
<h:outputText value="#{item.carsettings['car-color']}" />
</h:outputLink>
</p:column>
<p:column sortBy="#{item.carsettings.model}" filterBy="#{item.carsettings.model}">
<f:facet name="header">
<h:outputText value="Model" />
</f:facet>
<h:outputText value="#{item.carsettings.model}" />
</p:column>
<p:column sortBy="#{item.carsettings.manufacturer}" filterBy="#{item.carsettings.manufacturer}">
<f:facet name="header">
<h:outputText value="Manufacturer" />
</f:facet>
<h:outputText value="#{item.carsettings.manufacturer}" />
</p:column>
</p:dataTable>
</h:form>
</center>
</f:view>
</ui:define>
</ui:composition>
</h:body>
Сортировка не работает в приведенном выше коде
Пожалуйста, помогите
Ответы
Ответ 1
Мой опыт заключается в том, что поддержка подстроки bean (ViewScoped!) должна содержать собственный список строк. Так, например, если вы запрашиваете базу данных каждый раз, когда вы запрашиваете сортировку p:dataTable:value
, она не будет работать.
Решение. Соберите список из базы данных и сохраните его в локальной переменной List в резервной копии bean.
public List<Row> getDataTable() {
if (tableDataList == null)
tableDataList = loadListOnce();
return tableDataList;
}
Ответ 2
Проблема:
<f:event type="preRenderView" listener="#{MyBackingBean.load}"></f:event>
Сортировка выполняется с помощью <p:dataTable/>
at PhaseId.APPLY_REQUEST_VALUES
в списке, а <f:event type"preRenderView"/>
вы перезагружаете список в PhaseId.RENDER_RESPONSE
, и поэтому вы потеряли сортировку.
Решение: используйте <f:event type="postAddToView"/>
<f:event type="postAddToView" listener="#{MyBackingBean.load}" />
Это приведет к перезагрузке списка на этапе PhaseId.RESTORE_VIEW, прежде чем сортировка выполняется с помощью <p:dataTable/>
.
Протестировано с помощью PrimeFaces версии 3.1.1 и Mojarra 2.1.8
Ответ 3
Если вы заполняете таблицу в сортировке получателя (как описано выше).
Вы должны ввести свой геттер, например:
public List<Row> getTableData() {
if (tableDataList == null)
tableDataList = dao.getTableData();
return tableDataList;
}
Затем вы можете reset (обновить) свои "наличные", набрав tableDataList = null; если вы не обновите данные.
Ответ 4
У моей службы было:
public List<PlayerEntity> getAllPlayers() {
return playerDao.readAll();
}
но это было неправильно, потому что когда я вызывал getAllPlayers() из таблицы
<p:dataTable id="data" value="#{myBean.allPlayers}"/>
Я получил данные DAO, но все еще неупорядочен. Вместо этого я создал поле и метод List для обновления списка
private List<PlayerEntity> allPlayers = new ArrayList<PlayerEntity>();
public void updateAllPlayers(){
this.allPlayers = playerDao.readAll();
}
какой метод я запускаю в bean инициализации
public void setPlayerDao(PlayerDao playerDao) {
this.playerDao = playerDao;
updateAllPlayers();
}
и после добавления, удаления или изменения списка
public boolean createPlayer(PlayerEntity playerEntity) {
(...)
updateAllPlayers();
return true;
}
Теперь моя служба имеет
public List<PlayerEntity> getAllPlayers() {
return this.allPlayers;
}
и это решило мою проблему с сортировкой данных в таблице Primefaces.
Ответ 5
У меня была проблема сортировки, когда моя поддержка bean была sessionScoped. Не знаете, какова ваша конкретная проблема, но если вы нажмете кнопку сортировки и ничего не произойдет, попробуйте изменить область действия на @ViewScoped.
Ответ 6
Вы пробовали @SessionScoped? он отлично работает для меня, надеюсь эта помощь.
Ответ 7
Я не знаю, ваше дело. Там проблема с разделами. Ошибка в виде datatable. Посмотрите здесь:
https://code.google.com/archive/p/primefaces/issues/2476
Есть некоторые обходные пути:
-
вы можете использовать lazyDataModel для вашего datatable, он работает.
-
вы можете принудительно упорядочить порядок сортировки.
В вашем datatable catch событие сортировки
<p:dataTable style="width: 60%" id="dt1" value="#{bean.list}" var="entry" first="0" paginator="true" rows="10" paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" rowsPerPageTemplate="5,10,15" emptyMessage="No cars found with given criteria" >
<p:ajax event="sort" listener="#bean.sortListener}" />
В вашем управляемом bean вы задаете порядок по строке, чтобы добавить к вашему запросу
private String orderBy = "";
public void sortListener(SortEvent event) {
String orderColumn = event.getSortColumn().getValueExpression("sortBy").getExpressionString();
//you will get the content of the attribute SortBy of the column you clicked on, like #{entry.carno}
orderColumn = orderColumn.replace("#{entry.", "");
orderColumn = orderColumn.replace("}", "");
orderBy = " order by " + orderColumn + (event.isAscending()? " asc " : " desc ");
}
public List<Car> getList(){
String query = "[...your query...]" + orderBy;
...[execute your query and get your ordered list]
}