Primefaces数据表自定义分页不更新

时间:2013-09-19 16:51:13

标签: jsf jsf-2 primefaces

我正在开发一个我们拥有旧代码库(Struts 1)的应用程序,现在正在使用JSF构建一个更新的代码库,以便与其他(旧)应用程序一起运行。我们在应用程序中使用的旧数据表显示以下分页:

“显示50个参赛作品中的1到20个”

我的任务是让新的PF数据表以相同的方式显示。

通过覆盖primefaces encodePaginatorMarkup类的DataRenderer方法,我能够在第一页上工作。页面更改时出现问题 - 未调用此方法来更新分页。这让我感到困惑,因为当前页面(以及其他所有内容)在普通分页模板中得到更新,而不会调用此方法。

我查看了更改页面时发回的AJAX响应,并且没有看到为更新分页而生成的任何HTML(仅限总计数)。这让我相信所有东西都在JS中处理。

我目前正在考虑实施它的方式是使用f:ajax来更改页面,并在oncomplete中传递表的widgetVar值并拥有基于JS中该数据表的属性更新分页的常用方法。这似乎有点矫枉过正,如果我不需要,我不想让代码过于复杂。

还有更好的方法吗?有没有人有任何其他建议?

1 个答案:

答案 0 :(得分:0)

好了,因为没有其他输入我继续使用页面事件实现它:

<p:dataTable id="users" widgetVar="userTable" paginator="true" rows="20" sortBy="userId">
    <p:ajax event="page" oncomplete="setTimeout(function() { update_pagination('userTable'); }, 0)" />

    ...
</p:dataTable>

setTimeout是必需的,因为从oncomplete调用时JS对象仍然没有更新 - 所以我把它碰到了下一个事件循环,其中值是最新的。

这是update_pagination JS函数:

function update_pagination(table) {
    table = PF(table);

    var paginator = table.cfg.paginator;

    var $pageStart = $(table.jq).find('.paginator_pagestart');
    var $pageEnd = $(table.jq).find('.paginator_pageend');

    $pageStart.html(paginator.page*paginator.rows+1);
    $pageEnd.html(Math.min(paginator.rowCount, paginator.page*paginator.rows+paginator.rows));
}

我传递表名,抓取实际的PF对象,然后使用cfg的paginator部分更新当前显示的条目。我使用Math.min,因为在最后一页上它可能没有足够的数据,我不希望它读“显示7个条目中的1到20个”,而是“显示7个条目中的1到7个”