我们在我们的应用程序中使用了Primefaces 3.0.RC2以及接缝面和CDI。我们在组件展示中遵循了延迟加载的数据表实现。由于我们有一个大型数据集,因此我们重写了load()方法以仅获取逐页结果。 (vs一次加载内存中的所有记录)。
分页按预期工作,但排序没有。第一次单击列标题时,记录会正确排序。对于所有后续点击,load()方法被调用两次,为排序顺序发送不同的值,因此排序顺序在表上保持不变。似乎两个load()调用都是在APPLY_REQUEST_VALUES阶段进行的。
任何人都可以提供任何输入,说明为什么会发生这种情况以及如何避免这种情况。任何指针都将受到高度赞赏。
其他一些信息: 如前所述,我们已经覆盖了load()方法并让它实际查询数据库以逐页获取排序结果(通过在查询中指定最大结果和顺序)并且它工作正常。
@Override
public List<ABC> load(int first, int pageSize, String sortField, SortOrder
sortOrder, Map<String, String> filters)
{
// Fetch data pagewise from the database
datasource = dao.findPagewiseSortedResults(sortField,
SortOrder.ASCENDING == sortOrder ? true : false, first, pageSize);
// Set the row count
this.setRowCount((int) dao.findTotalCount());
return datasource;
}
但是,单击数据模型上的列进行排序时,会发出2个发布请求。
在下面找到xhtml代码:
<p:dataTable id="dataTable" var="record"
value="#{testBean.lazyModel}" paginator="true" rows="5"
paginatorTemplate="{FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
selectionMode="single" selection="#{testBean.selectedRecord}"
sortBy="#{record.username}">
<p:ajax event="rowSelect" listener="#{testBean.onRowSelect}"
update=":form:display" oncomplete="accountDialog.show()" />
<p:ajax event="colResize" update=":form:growl"
listener="#{testBean.onResize}" />
<p:column sortBy="#{record.username}"
filterBy="#{record.username}">
<f:facet name="header">
<h:outputText value="User Name" />
</f:facet>
<h:outputText value="#{record.username}" />
</p:column>.........
</dataTable>
我们甚至升级到最新的Primefaces版本(3.0.1),但它没有帮助。我们错过了什么吗?任何指针都会非常有用。
感谢。
答案 0 :(得分:0)
由于您使用load()方法提供排序,因此您不必使用dataTable的本机排序工具。您需要从sortBy
代码中删除p:dataTable
属性。
组件应以这种方式定义:
<p:dataTable id="dataTable" var="record"
value="#{testBean.lazyModel}" paginator="true" rows="5"
paginatorTemplate="{FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
selectionMode="single" selection="#{testBean.selectedRecord}" >
修改
通过这种方式,您可以按照客户端指定的顺序对列进行排序:您将使用已发布的Java代码读取指定的SortOrder,然后在执行dao时使用该SortOrder# findPagewiseSortedResults()