7

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>

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

4

1 に答える 1

31

現在のimmediate="true"入力コンポーネントは、他の入力コンポーネントのバリデーターの起動を停止しません。これにより、現在の入力コンポーネントが通常より1フェーズ前に検証されます。基本的に、入力コンポーネントにをアタッチしてから、listenerメソッド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" />

参照:

于 2011-10-07T13:36:26.647 に答える