我正在尝试根据支持 bean 上存在的布尔值显示/隐藏我的面板,但它没有按预期工作,并且 UI 没有变化。 这在应用程序加载时第一次正常工作(仅显示一个面板),但在没有执行更新之后。
我知道要执行更新,该元素应该已经存在于 dom 中,因此它不会更新服务器未呈现的面板。但我的疑问是,当布尔条件发生变化时,为什么另一个面板(在应用程序加载时显示)没有被隐藏。
xhtml 文件
<p:panel>
<h6 align="center" style="width: 14.7em; background-color: #ACBECE;">Case
Type</h6>
<!-- comment type -->
<p:selectOneListbox id="caseTypeId"
value="#{treeBean.caseTypeOption}">
<f:selectItems value="#{treeBean.caseType}" var="X"
itemLabel="#{X}" itemValue="#{X}" />
<p:ajax listener="#{treeBean.caseTypeList}" update=":#{p:component('panel2')} :#{p:component('panel3')}"/>
</p:selectOneListbox>
</p:panel>
<p:panel id="panel2" rendered="#{treeBean.editmode}">
<h6 align="center" style="width: 14.7em; background-color: #ACBECE;">Something
</h6>
<p:selectOneListbox id="somethingId"
value="#{treeBean.somethingOption}">
<f:selectItems value="#{treeBean.something}" var="X"
itemLabel="#{X}" itemValue="#{X}" />
</p:selectOneListbox>
</p:panel>
<p:panel id="panel3" rendered="#{!treeBean.editmode}">
<h6 align="center" style="width: 14.7em; background-color: #ACBECE;">Anything
</h6>
<p:selectOneListbox id="anythingId"
value="#{treeBean.anythingOption}">
<f:selectItems value="#{treeBean.anything}" var="X"
itemLabel="#{X}" itemValue="#{X}" />
</p:selectOneListbox>
</p:panel>
</h:panelGrid>
backing bean(略)
if (this.caseTypeOption.equalsIgnoreCase("XXX")) {
this.editmode = false;
} else {
this.editmode = true;
}
其中 XXX 是 caseTypeId 选择框的选项之一。
如何使这两个面板都起作用??
在更新操作中,您应该只使用要更新的组件的名称。在您的情况下,您应该使用 update=":form:panel2, :form:panel3"。 如果这个面板在表单中,你应该在组件名称之前使用 form 元素,否则只有组件名称会起作用。
而不是渲染属性,使用 visible 属性帮助我实现了我想要的。
所以而不是
<p:panel id="panel2" rendered="#{treeBean.editmode}">
我用过:
<p:panel id="panel2" visible="#{treeBean.editmode}">
谢谢纳西。工作顺利 嗨嗨