我有一个启用了分页的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;
}
...
}
答案 0 :(得分:2)
可惜但是视图范围内的bean和primefaces数据表似乎存在问题......但它并不是那么与主要相关,而是更多的JSF员工。由于发布了许多帖子,因此在Jsf中使用一些称为绑定的方法存在问题,该方法暂时重新创建视图bean。我不是有一种简单的方法可以绕过它。除非primafaces在视图范围内使用时在组件中找到更新方式。