【问题标题】:PrimeFaces dataTable pagination and javascriptPrimeFaces dataTable 分页和 javascript
【发布时间】:2017-09-17 13:39:54
【问题描述】:

我正在使用 PrimeFaces 6.1,我正在处理这样的表格

<p:dataTable 
    id="listingsTable"
    value="#{listingsController.listingsLazyDataModel}" 
    var="actualAd" 
    paginator="true"
    rows="20"
    lazy="true"
    paginatorTemplate="{FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
    rowsPerPageTemplate="10,20,30"
    paginatorPosition="bottom"
    widgetVar="listingsTableDesktop">

    <p:ajax event="page" listener="#{listingsController.pageChanged}" oncomplete="pageChangedOnDetails(PF('listingsTableDesktop'))" />

</p:dataTable>

javascript如下

function pageChangedOnDetails(listingsTableDesktop) {
    console.log("paginaDestinazione1="+listingsTableDesktop.paginator.getCurrentPage());
    console.log("paginaDestinazione2="+listingsTableDesktop.paginator.currentReport[0].innerText);
}

问题在于 pageChangedOnDetails 函数中的所有两行代码总是返回用户在页面事件之前所在的页面。

似乎是在更新dom之前调用了“onComplete”。

这是预期的行为吗? 我做错了吗?

【问题讨论】:

    标签: jsf primefaces jsf-2


    【解决方案1】:

    是的,您的 oncomplete 函数在数据表分页器 oncomplete 函数之前被调用。这适用于所有客户端回调(完成、成功、错误)。

    可以看一下primefacescore.ajax.js源码:

    complete: function(xhr, status) {
            // this is your callback
            if(cfg.oncomplete) {
                 cfg.oncomplete.call(this, xhr, status, xhr.pfArgs);
            }
    
            // this is the extension callback (datatable)
            if(cfg.ext && cfg.ext.oncomplete) {
                 cfg.ext.oncomplete.call(this, xhr, status, xhr.pfArgs);
            }
    

    https://github.com/primefaces/primefaces/blob/6c1b2bf1e7a3db568ba2b4ea21b211fc605c052b/src/main/resources/META-INF/resources/primefaces/core/core.ajax.js (第 572 行)- 这是 6.1 的源代码,不是当前的主代码。

    您可能会抓住调用者并尝试自己调用ext.oncomplete 或完全扩展该完整功能,但您最终可能会遇到混乱的解决方案。

    相反,如果您需要更新任何组件或执行任何 javascript 代码,我建议使用 ajax 侦听器方法 (pageChanged) 来获取当前页面并使用 RequestContext。

    https://www.primefaces.org/showcase/ui/misc/requestContext.xhtml

    编辑:使用请求上下文,您可以从 pageChanged 侦听器获取新页面,然后将此新页面发送到 javascript 函数 (processNewPage):

    public void onPageChanged(PageEvent pageEvent) {
        int newPage = pageEvent.getPage();
        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("processNewPage(" + newPage + ")");
    }
    

    还值得注意的是,从 6.0.10 开始,数据表组件会跨页面保持其状态: https://www.primefaces.org/showcase/ui/data/datatable/tableState.xhtml

    【讨论】:

    • 如果是这种情况,这是一个错误 imo... onComplete 应该在所有 dom 更新后调用...
    • 谢谢。在这种情况下,我不清楚如何结合 pageChanged 侦听器、remoteCommand 和 JavaScript 代码的执行。可以举个例子吗?
    • @Gavi 你能告诉我在你获得正确的当前页面后你想要实现什么吗?
    • @Kukeltje 不确定这是否是一个错误,因为这是预期的行为,但它绝对令人困惑。我已经与 Primefaces 的开发人员进行了讨论,以考虑改变这一点:forum.primefaces.org/viewtopic.php?f=3&t=52538
    • 获得当前页面后,我可以动态创建一个 url 以推送到历史记录中。使用这种方法,如果用户返回浏览器,应用程序将在 dataTable 中加载正确的页面
    猜你喜欢
    • 2011-07-29
    • 1970-01-01
    • 2014-02-11
    • 2012-02-09
    • 2012-09-12
    • 2016-10-02
    • 2013-08-21
    • 2011-06-14
    • 1970-01-01
    相关资源
    最近更新 更多