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>
排序在上面的代码中不起作用
请帮忙
答案 0 :(得分:40)
primefaces支持bean(ViewScoped!)必须拥有它自己的行列表。因此,例如,如果您在每次请求p:dataTable:value
时查询数据库,则排序将不起作用。
解决方案:从数据库中收集列表并将其保存在辅助bean中的本地List变量中。
public List<Row> getDataTable() {
if (tableDataList == null)
tableDataList = loadListOnce();
return tableDataList;
}
答案 1 :(得分:10)
问题是:
<f:event type="preRenderView" listener="#{MyBackingBean.load}"></f:event>
排序由列表中<p:dataTable/>
的{{1}}完成,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重新加载列表。
使用 PrimeFaces版本3.1.1 和 Mojarra 2.1.8 进行测试
答案 2 :(得分:5)
如果在getter排序中填充表格将不起作用(如上所述)。 你应该把你的吸气剂放在:
public List<Row> getTableData() {
if (tableDataList == null)
tableDataList = dao.getTableData();
return tableDataList;
}
然后你可以通过punting tableDataList = null来重置(刷新)你的“现金”;如果你不刷新你的数据表。
答案 3 :(得分:1)
我的服务有:
public List<PlayerEntity> getAllPlayers() {
return playerDao.readAll();
}
但这是错误的,因为当我从表
调用getAllPlayers()时<p:dataTable id="data" value="#{myBean.allPlayers}"/>
我从DAO刷新了数据,但仍然无序。而不是我已经创建了List字段和方法来更新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表中排序数据的问题。
答案 4 :(得分:0)
当我的支持bean是sessionScoped时,我有一个问题。不确定您的确切问题是什么,但如果您点击排序按钮但没有任何反应,请尝试将范围更改为@ViewScoped。
答案 5 :(得分:0)
答案 6 :(得分:0)
我不知道你的情况。有一个主要问题。有关数据表的错误。看看这里: https://code.google.com/archive/p/primefaces/issues/2476
有一些解决方法:
您可以为数据表使用lazyDataModel,它可以正常工作。
您可以强制排序顺序。
在您的数据表中捕获排序事件
<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]
}