10

我多次查看我的代码并没有发现有关它的问题。

我对 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>
4

2 回答 2

18

您只能对始终呈现的组件进行 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>

也可以看看:

于 2013-02-20T13:14:24.413 回答
0

如果您不想修改代码,可以使用 css 代替呈现的 ej:

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

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

于 2018-06-29T12:02:51.487 回答