【问题标题】:How to make a conditionally required element un-required based on condition如何根据条件使有条件需要的元素不需要
【发布时间】:2021-08-27 19:41:41
【问题描述】:

在我的应用程序中,我有一个复选框,用于在我的控制器中设置一个变量,以及一个 selectOneMenu,它将仅根据所述变量的值呈现。根据@BalusC 的回答here,我在 required 属性中放置了相同的条件,因为当它被选中时,它是必需的。我的问题是,一旦呈现,当我取消选中该框时,选择一个菜单不会消失,因为它现在也是必需的。在我将条件添加到所需属性之前,选择一个菜单将按预期隐藏/消失。
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;
}

简而言之,我试图在未选中该框时使选择一个菜单消失,就像我在将条件添加到所需属性之前所做的那样,但它不会因为它现在是必需的。我怎样才能做到这一点?

【问题讨论】:

  • waitThenHideModal的代码是什么?无论如何,您在更新所需表达式之前处理selectOneMenu(因此仍然需要它的字段),尝试根据您的需要重新设计您的表单(例如,仅对selectBooleanCheckbox 更改事件进行更新)
  • &lt;script type="text/javascript"&gt; function waitThenHideModal(){ setTimeout(function(){PF('statusDialog').hide();},5000); } &lt;/script&gt; 这是一个在5秒后隐藏加载指示器“statusDialog”的功能。我会在选中该框时出现并且永远旋转,所以我让它等待 5 秒,然后将其关闭。
  • 为此你也可以使用AjaxFramework Status

标签: jsf primefaces


【解决方案1】:

是您的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>

【讨论】:

    猜你喜欢
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2020-02-20
    • 2020-06-02
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多