如何根据条件使有条件的必需元素成为非必需元素
How to make a conditionally required element un-required based on condition
在我的应用程序中,我有一个复选框,用于在我的控制器中设置一个变量,还有一个 selectOneMenu,它只会根据所述变量的值呈现。根据@BalusC 的回答 here,我在 required 属性中放置了相同的条件,因为当它被 selected 时,它需要被要求。我的问题是,一旦呈现,当我取消选中该框时,select 一个菜单不会消失,因为它现在也是必需的。在我将条件添加到 required 属性之前,select 一个菜单会按预期 hide/go 消失。
xhtml:
<h:panelGroup rendered="#{kaizenEntry.isDealer()}">
<div class="ui-g-4 ui-lg-3">
<p:outputLabel value="Is This a Customer Shop Site?" for="shopSiteBox" />
</div>
<div class="ui-g-4 ui-lg-3">
<p:selectBooleanCheckbox id="shopSiteBox" value="#{kaizenEntry.checked}" onchange="waitThenHideModal()" disabled="#{kaizenEntry.disabled}" process="@form">
<f:ajax render="shopSitePanel" execute="shopSitePanel" />
</p:selectBooleanCheckbox>
</div>
<h:panelGroup id="shopSitePanel" layout="block">
<div class="ui-g-4 ui-lg-3">
<p:outputLabel rendered="#{kaizenEntry.checked}" value="Shop Site" for="shopSitesDropdown" />
</div>
<div class="ui-g-8 ui-lg-3">
<p:selectOneMenu rendered="#{kaizenEntry.checked}"
required="#{kaizenEntry.checked}"
disabled="#{kaizenEntry.disabled}"
id="shopSitesDropdown"
styleClass="categoryClass"
style="width:150px"
value="#{kaizenEntry.kaizenMain.shopSite}"
filter="true"
filterMatchMode="startsWith">
<f:selectItem itemLabel="--Select--" itemValue="#{null}"/>
<f:selectItems value="#{kaizenEntry.shopSiteList}" var="c"
itemLabel="#{c.storeNumber} - #{c.addressLine1} - #{c.city} #{c.st}, #{c.zip}"
itemValue="#{c.storeNumber} - #{c.addressLine1} - #{c.city} #{c.st}, #{c.zip}" />
</p:selectOneMenu>
</div>
</h:panelGroup>
</h:panelGroup>
控制器:
private boolean checked;
public boolean isChecked() {
return checked;
}
public void setChecked(boolean checked) {
this.checked = checked;
}
简而言之,我试图让 select 一个菜单在未选中该框时消失,就像我将条件添加到所需属性之前所做的那样,但不会,因为现在是必需的。我怎样才能做到这一点?
是您的 execute="shopSitePanel"
导致了“必需”触发器的发生。对于 SelectOne,您只想显示或隐藏值而不处理它。将您的代码更改为...
<p:selectBooleanCheckbox id="shopSiteBox" value="#{kaizenEntry.checked}" onchange="waitThenHideModal()" disabled="#{kaizenEntry.disabled}" process="@form">
<p:ajax update="shopSitePanel" process="@this" />
</p:selectBooleanCheckbox>
在我的应用程序中,我有一个复选框,用于在我的控制器中设置一个变量,还有一个 selectOneMenu,它只会根据所述变量的值呈现。根据@BalusC 的回答 here,我在 required 属性中放置了相同的条件,因为当它被 selected 时,它需要被要求。我的问题是,一旦呈现,当我取消选中该框时,select 一个菜单不会消失,因为它现在也是必需的。在我将条件添加到 required 属性之前,select 一个菜单会按预期 hide/go 消失。
xhtml:
<h:panelGroup rendered="#{kaizenEntry.isDealer()}">
<div class="ui-g-4 ui-lg-3">
<p:outputLabel value="Is This a Customer Shop Site?" for="shopSiteBox" />
</div>
<div class="ui-g-4 ui-lg-3">
<p:selectBooleanCheckbox id="shopSiteBox" value="#{kaizenEntry.checked}" onchange="waitThenHideModal()" disabled="#{kaizenEntry.disabled}" process="@form">
<f:ajax render="shopSitePanel" execute="shopSitePanel" />
</p:selectBooleanCheckbox>
</div>
<h:panelGroup id="shopSitePanel" layout="block">
<div class="ui-g-4 ui-lg-3">
<p:outputLabel rendered="#{kaizenEntry.checked}" value="Shop Site" for="shopSitesDropdown" />
</div>
<div class="ui-g-8 ui-lg-3">
<p:selectOneMenu rendered="#{kaizenEntry.checked}"
required="#{kaizenEntry.checked}"
disabled="#{kaizenEntry.disabled}"
id="shopSitesDropdown"
styleClass="categoryClass"
style="width:150px"
value="#{kaizenEntry.kaizenMain.shopSite}"
filter="true"
filterMatchMode="startsWith">
<f:selectItem itemLabel="--Select--" itemValue="#{null}"/>
<f:selectItems value="#{kaizenEntry.shopSiteList}" var="c"
itemLabel="#{c.storeNumber} - #{c.addressLine1} - #{c.city} #{c.st}, #{c.zip}"
itemValue="#{c.storeNumber} - #{c.addressLine1} - #{c.city} #{c.st}, #{c.zip}" />
</p:selectOneMenu>
</div>
</h:panelGroup>
</h:panelGroup>
控制器:
private boolean checked;
public boolean isChecked() {
return checked;
}
public void setChecked(boolean checked) {
this.checked = checked;
}
简而言之,我试图让 select 一个菜单在未选中该框时消失,就像我将条件添加到所需属性之前所做的那样,但不会,因为现在是必需的。我怎样才能做到这一点?
是您的 execute="shopSitePanel"
导致了“必需”触发器的发生。对于 SelectOne,您只想显示或隐藏值而不处理它。将您的代码更改为...
<p:selectBooleanCheckbox id="shopSiteBox" value="#{kaizenEntry.checked}" onchange="waitThenHideModal()" disabled="#{kaizenEntry.disabled}" process="@form">
<p:ajax update="shopSitePanel" process="@this" />
</p:selectBooleanCheckbox>