2

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

“显示 1 到 20 个条目,共 50 个条目”

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

encodePaginatorMarkup通过覆盖primefacesDataRenderer类的方法,我能够在第一页上使用它。当页面更改时出现问题 - 没有调用此方法来更新分页。这让我感到困惑,因为当前页面(以及其他所有内容)在正常分页模板中更新,而没有调用此方法。

我查看了更改页面时发回的 AJAX 响应,没有看到为更新分页而生成的任何 HTML(只有总数)。这让我相信一切都在 JS 中处理。

我目前正在考虑实现它的方式是使用一个f:ajax来更改页面,并在oncomplete传递widgetVar表的值并具有一个通用方法,该方法将根据 JS 中该数据表的属性更新分页。这似乎有点矫枉过正,如果我不需要的话,我不想过度复杂化代码。

有没有更好的方法来解决这个问题?有没有人有任何其他建议?

4

1 回答 1

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 是必需的,因为 JS 对象在调用时仍未更新oncomplete- 所以我将它撞到下一个事件循环中,其中的值是最新的。

这是 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 的分页器部分来更新当前显示的条目。我使用 Math.min 是因为在最后一页上它可能没有足够的数据,而且我不希望它阅读“显示 7 个条目中的 1 到 20 个”,而是“显示 7 个条目中的 1 到 7 个”

于 2013-09-23T15:36:34.613 回答