web-dev-qa-db-ja.com

h:selectOneMenu onchange = "submit()" immediate = "true"は他の入力の検証をスキップしません

他の入力を検証せずにすぐに送信するように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>

メニュー値を変更しても、他の入力のバリデーターは引き続き起動します。どうすればそれを否定できますか?

7
Deniz

現在の入力コンポーネントの_immediate="true"_は、他の入力コンポーネントのバリデーターの起動を停止しません。これにより、現在の入力コンポーネントが通常より1フェーズ前に検証されるだけです。基本的に、valueChangeListenerを入力コンポーネントにアタッチしてから、リスナーメソッドでFacesContext#renderResponse()を呼び出して、他のすべての入力コンポーネントの処理がスキップされるようにする必要があります。

しかし、すでにJSF 2.0を使用しているので、この昔ながらのJSF 1.xアプローチの代わりに、ajaxパワーを使用する方がはるかに優れています。

例えば。

_<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" />
_

参照:

29
BalusC