他の入力を検証せずにすぐに送信するように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>
メニュー値を変更しても、他の入力のバリデーターは引き続き起動します。どうすればそれを否定できますか?
現在の入力コンポーネントの_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" />
_