4

フォームに「必須」が「true」に設定された空の要素がある場合<h:selectOneMenu>、別の値に応じて値を自動的に設定する方法(または他のコンポーネント)を誰かに教えてもらえますか? <h:selectOneMenu>設定する場合、<a4j:support event="onchange" reRender="anotherElement" immediate="true" />変更された値が設定されていないため、何も変更されません。しかしimmediate="true"、これまたはその要素を空にすることはできないというメッセージが常にあります。動作しないコード例を次に示します。

<h:outputLabel value="* #{msg.someField}: "/>
<h:panelGrid cellpadding="0" cellspacing="0">
    <h:selectOneMenu id="someSelect"
            value="#{MyBean.someObj.someId}"
            required="true" label="#{msg.someField}"
            >
        <a4j:support event="onchange" reRender="anotherSelect" limitToList="true" immediate="true"/>
        <f:selectItem itemValue=""/>
        <f:selectItems value="#{MyBean.someList}"/>
    </h:selectOneMenu>
    <rich:message for="someSelect" styleClass="redOne"/>
</h:panelGrid>

<h:outputLabel value="* #{msg.anotherField}: "/>
<h:panelGrid cellpadding="0" cellspacing="0">
    <h:selectOneMenu id="anotherSelect"
            value="#{MyBean.someObj.anotherId}"
            required="true" label="#{msg.anotherField}"
            >
        <f:selectItem itemValue=""/>
        <f:selectItems value="#{MyBean.anotherList}"/>
    </h:selectOneMenu>
    <rich:message for="anotherSelect" styleClass="redOne"/>
</h:panelGrid>

<h:outputLabel value="* #{msg.name}: "/>
<h:panelGrid cellpadding="0" cellspacing="0">
    <h:inputText id="myName" value="#{MyBean.someObj.myName}" 
            required="true" label="#{msg.name}"/>
    <rich:message for="myName" styleClass="redOne"/>
</h:panelGrid>

したがって、ここで (繰り返します)、「someSelect」を変更しようとすると、「anotherSelect」はその値を更新する必要がありますが、「someSelect」の値を取得しようとすると null (にimmediate設定されている場合true) または空の要素ではフォームの検証が失敗します。検証をスキップして、この変更された値を「someSelect」から取得するにはどうすればよいですか?

4

2 に答える 2

2

ajaxSingle="true"someSelect a4j:support 要素に追加しようとしましたか? を取り外しますimmediate="true"

于 2010-06-03T16:21:07.093 に答える
0

次のソリューションは JSF 2.0 で機能します

<h:outputLabel
    value="* Country: "/>
<h:selectOneMenu
    id="someSelect"
    value="#{testController.countryName}"
    required="true">
    <f:selectItem
        itemLabel="Select Country"
        itemValue=""/>
    <f:selectItems
        value="#{testController.countryNamesSelectItems}"/>
    <!-- This will only update "someSelect" and repaint "anotherSelect" -->
    <f:ajax
        execute="@this"
        render="anotherSelect"/>
</h:selectOneMenu>

<h:outputLabel
    value="* State: "/>
<h:selectOneMenu
    id="anotherSelect"
    value="#{testController.stateName}"
    required="true">
    <f:selectItem
        itemLabel="Select State"
        itemValue=""/>
    <f:selectItems
        value="#{testController.stateNamesSelectItems}"/>
</h:selectOneMenu>

f:ajax 呼び出しは、「someSelect」の変更時にサーバーに ajax 要求を送信します。「someSelect」コンポーネントのみのモデル更新が行われます (execute="@this" のため)。応答のレンダリング フェーズでは、「anotherSelect」のみが再レンダリングされます (したがって、更新された国名で testController.stateNamesSelectItems が呼び出されます)。

このすべての結果として、選択した国の州は、国が変更されたときに更新されます... ajax の方法です。

お役に立てれば。

于 2010-06-03T16:57:37.123 に答える