p:在ajax更新后,commandButton呈现的属性不起作用(Primefaces 3.5)

时间:2013-02-19 23:14:46

标签: jsf-2 primefaces

我经常查看我的代码并没有找到有关它的问题。

我的p:commandButton呈现属性有问题。即使getter方法返回false,也会显示p:commandButton。这是在ajax更新后发生的。

我有ap:selectOneMenu与ap:ajax event =“change”设置MB并更新ap:commandButton(具有基于布尔getter的呈现属性)和另外两个组件:第二个p:selectOneMenu和ap: outputLabel。

当我更改第一个p:selectOneMenu选项时,第二个p:selectOneMenu和p:outputLabel没有问题,但p:commandButton总是显示出来。渲染的属性不会更新。

如果我刷新浏览器或者如果我设置了update =“@ form”,则p:commandButton会正确显示/隐藏。但请注意,所有组件都在同一个容器中。

我做错了什么?代码:

<p:selectOneMenu id="cmbPais" value="#{pessoaController.selected.endereco.pais}">
    <f:selectItems value="#{paisController.itemsSelectOne}"/>
    <p:ajax event="change" update="cmbEstado,btnBuscaPeloEndereco,test"/>
</p:selectOneMenu>

<p:outputLabel id="test" value="#{pessoaController.selected.endereco.ok}"/>

<p:commandButton id="btnBuscaPeloEndereco" icon="ui-icon-correios" type="button" onclick="dlgCEP.show();" rendered="#{pessoaController.selected.endereco.ok}"/>

<p:selectOneMenu id="cmbEstado" value="#{pessoaController.selected.endereco.estado}">
    <f:selectItems value="#estadoController.getItemsSelectOne(pessoaController.selected.endereco.pais)}"/>
    <f:ajax event="change" render="cmbCidade" />
</p:selectOneMenu>

2 个答案:

答案 0 :(得分:17)

您只能ajax更新始终呈现的组件(即,当它没有rendered属性时)。 JSF ajax引擎不支持添加/删除HTML元素。它只支持更改HTML元素。

因此,请将其包装在一个始终呈现的组件中,然后将其更新为ajax。

<p:selectOneMenu id="cmbPais" value="#{pessoaController.selected.endereco.pais}">
    <f:selectItems value="#{paisController.itemsSelectOne}"/>
    <p:ajax event="change" update="cmbEstado,btnBuscaPeloEndereco,test"/>
</p:selectOneMenu>

<h:panelGroup id="btnBuscaPeloEndereco">
    <p:commandButton icon="ui-icon-correios" type="button" onclick="dlgCEP.show();" rendered="#{pessoaController.selected.endereco.ok}"/>
</h:panelGroup>

另见:

答案 1 :(得分:0)

如果您不想修改代码,则可以使用CSS代替渲染 ej:

<x:element style="#{condition ? 'visibility: hidden':' visibility: visible'}" />

编辑: 某些用户可以撤消此操作,因此如果您需要安全,则不要使用。但是,如果您只想出于视觉目的隐藏/显示,则可以使用它。