Primefaces - 自定义分页/排序load()问题

时间:2012-01-13 19:34:15

标签: datatable primefaces

我们在我们的应用程序中使用了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),但它没有帮助。我们错过了什么吗?任何指针都会非常有用。

感谢。

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()