带有ajax分页的primefaces数据表重新创建了viewscoped bean

时间:2013-11-27 18:14:08

标签: ajax primefaces datatable pagination commandbutton

我有一个启用了分页的Primefaces数据表(当我们在单击分页符链接的页面之间移动时,我认为它使用了ajax请求。)

在每一行中,我都有一个用于编辑行的命令按钮。此命令按钮的方法操作设置托管bean属性以隐藏数据表并显示编辑表单。我这样做是通过将数据表封装在一个面板组中,将编辑表单封装在另一个面板组中,并相应地将面板组的呈现属性设置为托管bean属性。

托管bean是Viewscoped,我拥有的所有请求都是非ajax。

当我在第一个数据表页面的一行上单击编辑命令按钮时,一切正常。

但是如果我使用paginator链接移动到另一个数据表页面,然后我单击页面任何一行上的edit命令按钮,它就不起作用,因为再次创建了Viewscoped bean(触发了PostConstruct),并且甚至我可以看到点击的命令按钮的动作方法没有被执行。

我认为这与分页器的ajax请求有关(我猜)。

有人知道如何让它发挥作用吗?

谢谢。

我在这里放了相关的代码,以便更好地了解情况。

我的观点:

<ui:composition template="/paginas/plantillas/plantilla.xhtml">

    <ui:define name="contenido">

        <h:panelGroup rendered="#{clienteController.pagina=='LISTA'}">
            <p:messages globalOnly="true" layout="table" closable="true" />
            <p:dataTable id="tablaClientes" value="#{clienteController.clientesLazyList}" var="cli"
                 dblClickSelect="TRUE"
                 selectionMode="single"
                 selection="#{clienteController.cliente}"
                 rowKey="#{cli.id}"
                 paginator="true" rows="10" rowsPerPageTemplate="5,10,15" paginatorPosition="bottom"
                 currentPageReportTemplate="Total filas: {totalRecords} (mostrando {startRecord} a {endRecord}) (Página {currentPage} de {totalPages})"
                 paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} Filas/página: {RowsPerPageDropdown}"
                 emptyMessage="#{clienteController.msjListaVacia}"
                 lazy="true">

                <p:column ...> ... </p:column>
                      ...
                <p:column headerText="Editar">
                     <h:form>
                     <p:commandButton ajax="false" action="#{clienteController.editarAction(cli)}" title="Editar" icon="ui-icon-pencil" />
                     </h:form>
                </p:column>
            </p:dataTable>
        </h:panelGroup>

        <h:panelGroup rendered="#{clienteController.pagina=='FORM'}">
            <p:messages globalOnly="true" layout="table" closable="true" />
            <h:form id="formCliente">
                    ...
                    ...
            </h:form>
        </h:panelGroup>

    </ui:define>

</ui:composition>

我的托管bean:

@ManagedBean(name="clienteController")
@ViewScoped
public class ClienteController extends BaseController {

    ...

    public ClienteController() {
        log.info("Constructor ClienteController");
    }

    @PostConstruct
    public void cargarAtributos() {
        ...
        this.pagina = TipoPagina.LISTA;
        log.info("PostConstruct ClienteController");
    }

    // Getters y Setters
    ...

    // EVENTO: Pulsar el enlace "editar" de la pantalla "lista"
    public String editarAction (Cliente c) {
        log.info("Método editarAction");
        ...
        this.pagina = TipoPagina.FORM;
        return null;
    }

    ...
}

1 个答案:

答案 0 :(得分:2)

可惜但是视图范围内的bean和primefaces数据表似乎存在问题......但它并不是那么与主要相关,而是更多的JSF员工。由于发布了许多帖子,因此在Jsf中使用一些称为绑定的方法存在问题,该方法暂时重新创建视图bean。我不是有一种简单的方法可以绕过它。除非primafaces在视图范围内使用时在组件中找到更新方式。