我有一个 panelGrid,其中一行包含一个 selectCheckBoxMenu,另一行应该根据选择显示或隐藏。
不希望在更改选择时更新整个面板,因为 selectCheckBoxMenu 将被刷新,并且用户必须为他想要选择的每个项目再次打开下拉列表。
更新要隐藏或显示的控件也不能解决问题,因为如果它们未显示则无法更新,因为之前渲染为假。
因此,我将这些控件包装在一个片段中并更新这些片段。功能上没问题,但现在我的布局很丑,因为在大多数情况下,控件将被隐藏并显示一个小的空行。
是否有可能在不再次破坏功能的情况下摆脱那个丑陋的空行?
我的 xhtml 看起来像这样:
<p:panelGrid id="panel" columns="2" border="0" cellpadding="5"
cellspacing="2">
...
<h:outputLabel value="Type" />
<p:selectCheckboxMenu id="deviceTypeMenu" value="#{controller.criteria.dts}" label="All" converter="dtConverter"
filter="true" filterMatchMode="contains"
panelStyle="width:300px" valueChangeListener="#{controller.onChange}"
updateLabel="true">
<p:ajax update="sclabel scfield" />
<f:selectItems value="#{deviceTypeBean.alldts}" var="dt"
itemLabel="#{dt.name}" itemValue="#{dt}"/>
</p:selectCheckboxMenu>
...
<p:fragment id="sclabel">
<h:outputText value="Detail" rendered="#{controller.detailRequired}"/>
</p:fragment>
<p:fragment id="scfield">
<p:selectCheckboxMenu rendered="#{controller.detailRequired}" converter="#{detailConverter}"
value="#{controller.criteria.detail}" label="All details"
filter="true" filterMatchMode="contains"
style="width:300px;" scrollHeight="100"
updateLabel="true">
<f:selectItems value="#{detailConverter.values}" var="adetail"
itemLabel="#{adetail.name}" itemValue="#{adetail}" />
</p:selectCheckboxMenu>
</p:fragment>
...
</p:panelGrid>