我正试图根据backingbean上的布尔值来显示/隐藏我的面板,但它没有按预期工作,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>
支持bean(省略细节(
if (this.caseTypeOption.equalsIgnoreCase("XXX")) {
this.editmode = false;
} else {
this.editmode = true;
}
其中XXX是caseTypeId选择框中的选项之一。
如何使这对两个面板都有效??
在更新操作中,您应该只使用要更新的组件的名称。在您的情况下,您应该使用update=":form:panel2,:form:ppanel3">。如果这些面板处于表单中,则应在组件名称之前使用表单元素,否则仅使用组件名称即可。
使用visible属性帮助我实现了我想要的目标,而不是渲染属性。
因此,代替<p:panel id="panel2" rendered="#{treeBean.editmode}">
我使用过:<p:panel id="panel2" visible="#{treeBean.editmode}">