我正在开发一个我们拥有旧代码库(Struts 1)的应用程序,现在正在使用JSF构建一个更新的代码库,以便与其他(旧)应用程序一起运行。我们在应用程序中使用的旧数据表显示以下分页:
“显示50个参赛作品中的1到20个”
我的任务是让新的PF数据表以相同的方式显示。
通过覆盖primefaces encodePaginatorMarkup
类的DataRenderer
方法,我能够在第一页上工作。页面更改时出现问题 - 未调用此方法来更新分页。这让我感到困惑,因为当前页面(以及其他所有内容)在普通分页模板中得到更新,而不会调用此方法。
我查看了更改页面时发回的AJAX响应,并且没有看到为更新分页而生成的任何HTML(仅限总计数)。这让我相信所有东西都在JS中处理。
我目前正在考虑实施它的方式是使用f:ajax
来更改页面,并在oncomplete
中传递表的widgetVar
值并拥有基于JS中该数据表的属性更新分页的常用方法。这似乎有点矫枉过正,如果我不需要,我不想让代码过于复杂。
还有更好的方法吗?有没有人有任何其他建议?
答案 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个”