p:带分页器的dataTable:如何使用p:printer打印没有paginator的所有行

时间:2015-05-08 09:35:32

标签: jsf primefaces printing datatable paginator

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

1 个答案:

答案 0 :(得分:6)

好吧,我实际上能够以非常不愉快的方式实现所期望的行为。

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

我的想法是重新渲染没有分页器的表,刷新它并传递给打印机,之后恢复表的状态。为了能够这样做,我创建了两个按钮:一个触发表重新呈现,另一个将该表传递给打印机并恢复它的状态。

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

以下是生成的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>

方法&#39;实现很简单。所有需要做的就是相应地设置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可以涵盖所有这些疯狂。

这个解决方案被提议作为解决方法,我不认为这是一种正确的做事方式。但我也不认为还有另一种方法可以使用p:printer来完成所需的工作。