【问题标题】:h:selectOneMenu onchange="submit()" immediate="true" does not skip validation of other inputsh:selectOneMenu onchange="submit()" immediate="true" 不跳过其他输入的验证
【发布时间】:2011-10-07 13:31:27
【问题描述】:

我无法将我的h:selectOneMenu 设置为在不验证其他输入的情况下立即提交。代码如下:

<h:selectOneMenu value="#{a.avalue}" onchange="submit()" immediate="true">   
    <f:selectItems value="#{b.bvalue}" var="k" itemLabel="#{k.asdad}"  
        itemValue="#{k.asdad}"/>   
</h:selectOneMenu>   
<h:inputText id="sada" value="#{c.cvalue}" required="true"  
    requiredMessage="*asdadadadasd"  
    validatorMessage="*asdsadadadadad">   
    <f:validateLength maximum="80"/>   
</h:inputText>

当我更改菜单值时,其他输入的验证器仍然会触发。我怎么能否认呢?

【问题讨论】:

    标签: jsf-2 selectonemenu


    【解决方案1】:

    当前输入组件上的immediate="true" 不会阻止其他输入组件的验证器触发。它只会导致当前输入组件将比平时提前一个阶段进行验证。基本上,你需要在输入组件上附加一个valueChangeListener,然后在监听器方法中调用FacesContext#renderResponse(),这样就可以跳过所有其他输入组件的处理。

    但是由于您已经在使用 JSF 2.0,所以更好/更简单的是使用 ajax 功能而不是这种老式的 JSF 1.x 方法。

    例如

    <h:selectOneMenu value="#{bean.country}">
        <f:selectItems value="#{bean.countries}" var="country" itemLabel="#{country.name}" itemValue="#{country.code}"/>
        <f:ajax listener="#{bean.changeCountry}" />
    </h:selectOneMenu>   
    

    public void changeCountry() {
        System.out.println("Selected country is: " + country);
    }
    

    如果您想在选择更改时重新呈现表单的某些部分,请使用render 属性。例如

        <f:ajax listener="#{bean.changeCountry}" render="otherComponentId" />
    

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 2014-03-16
      • 1970-01-01
      相关资源
      最近更新 更多