h:selectOneMenu onchange =“submit()”immediate =“true”不会跳过其他输入的验证

时间:2011-10-07 13:31:28

标签: jsf-2 selectonemenu

我无法在不验证其他输入的情况下立即提交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>

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

1 个答案:

答案 0 :(得分:28)

当前输入组件上的immediate="true"不会阻止其他输入组件的验证程序触发。它只会导致当前输入组件比平时更早地验证一个阶段。基本上,您需要将valueChangeListener附加到输入组件,然后在侦听器方法中调用FacesContext#renderResponse(),以便跳过所有其他输入组件的处理。

但是,由于您已经在使用JSF 2.0,因此使用ajax功能而不是使用这种老式的JSF 1.x方法会更好/更容易。

E.g。

<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属性。 E.g。

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

另见: