p:dataTable with paginator: 如何在没有分页器的情况下使用 p:printer 打印所有行

p:dataTable with paginator: how to use p:printer to print all rows without paginator

在带有分页器的 <p:dataTable> 中,我需要打印所有页面。当我使用 <p:printer> 并将数据 table 作为目标时,它只打印带有分页控件的第一页。如何用 <p:printer> 打印 table 的所有行?

好的,我实际上能够实现所需的行为,但是以一种非常不愉快的方式。

首先,p:printer 似乎只是通过 id 从 xhtml 页面获取一个 DOM 元素并将其传递给打印机。因此,为了能够打印完整的 table 它首先应该重新渲染。

我的想法是在没有分页器的情况下重新渲染 table,刷新它并传递给打印机,然后恢复 table 的状态。为了能够做到这一点,我创建了两个按钮:一个触发 table 重新渲染,另一个将此 table 传递给打印机并恢复其状态。

第一个按钮可见,是用户按下以进行打印的按钮。它调用 deactivatePaginator() 方法来禁用分页并准备 table 视图以供打印。 第二个按钮是隐藏的,是包含 p:printer 组件的实际按钮。它调用 activatePaginator() 方法来恢复 table 视图。

这是生成的 xhtml 页面:

<p:dataTable id="table" value="#{someBean.list}" var="str" paginator="#{someBean.paginatorActive}" rows="#{someBean.paginatorActive ? 10 : 0}">
    <p:column headerText="Header">
        <h:outputLabel value="#{str}"/>
    </p:column>
</p:dataTable>
<h:form id='frm'>
    <p:commandButton value="Print" actionListener="#{someBean.deactivatePaginator()}" 
                             oncomplete="$('#frm\:print').click()"
                             update=":table"/>
     <p:commandButton id="print" value="Actual print" style="display: none">
         <p:ajax event="click" listener="#{someBean.activatePaginator()}" update=":table"/>
         <p:printer target=":table" />
     </p:commandButton>
</h:form>

方法的实现很简单。所需要做的就是相应地设置 paginatorActive 标志。

@ViewScoped
@ManagedBean
public class SomeBean {

    private boolean paginatorActive = true;

    public void activatePaginator() {
        paginatorActive = true;
    }

    public void deactivatePaginator() {
        paginatorActive = false;
    }

    public boolean isPaginatorActive() {
        return paginatorActive;
    }
}

p:blockUI 可以解决所有这些疯狂问题,因为多个 table 更新会导致快速故障。

此解决方案是作为解决方法提出的,我认为这不是正确的处理方法。但我也不认为还有另一种方法可以使用 p:printer.

来完成所需的操作