1

複数のコンポーネントを含む 1 つのフォームがあり、そのうちのいくつかには独自の検証があり、必須です。selectOneMenu次に、リストに同じ 3 つの要素を持つコンポーネントもいくつかありselectItemます。commandButtonすべてのリストに同じ値を選択するために、3 つ定義しました (commandButton可能な値ごとに 1 つ)。

JSF セクション

<table>
    <tr>
        <td>
            <h:outputText value="ID:" />
        </td>
        <td>
            <h:inputText value="#{MyClass.id}" id="inTxt_id" required="true">
                <f:validator validatorId="CheckIDPattern" />
            </h:inpuText>
            <h:message for="inTxt_id" errorClass="error" />
        </td>
    </tr>
</table>
<table>
    <tr>
        <td>
            <h:commandButton value="Select all opt1" action="#{MyClass.selectOpt1}" />
            <h:commandButton value="Select all opt2" action="#{MyClass.selectOpt2}" />
            <h:commandButton value="Select all opt3" action="#{MyClass.selectOpt3}" />
        </td>
    </tr>
    <tr>
        <td>
            <h:outputText value="List 1:" />
        </td>
        <td>
            <h:selectOneMenu value="#{MyClass.list1Val}">
                <f:selectItems value="#{MyClass.listOfOptions}" />
            </h:selectOneMenu>
        </td>
    <tr>
        <td>
            <h:outputText value="List 2:" />
        </td>
        <td>
            <h:selectOneMenu value="#{MyClass.list2Val}">
                <f:selectItems value="#{MyClass.listOfOptions}" />
            </h:selectOneMenu>
        </td>
    </tr>
    <tr>
         //Many other selectOneMenu components...
    </tr>
</table>
<h:commandButton action="#{MyClass.saveLists}" value="Submit" />

MyClass.java

public String selectOpt1(){
    this.list1Val = 1;
    this.list2Val = 1;
    //...
    return "";
}

//The same idea for selectOpt2 and selectOpt3.

このコンテキストでは、ユーザーが ID を入力せずに「すべて選択」ボタンの 1 つを押すとinputText、エラー メッセージが表示されますが、フォームへの入力が完了していないと思われるため、これは望ましくありません。ユーザーが「リストの保存」ボタンを押したときに検証を実行したいだけです。

「すべて選択」ボタンに追加しようとしましimmediate="true"たが、機能しますが、モデルからビューを更新せず、ユーザーは値が変更されたことを認識しません...実際には機能しません。

何を達成したいですか?最後のボタン(送信)のときに検証を実行したいだけです。そのため、ユーザーは以前に必須コンポーネントを入力しなくても、これらの「すべて選択」ボタンを使用できました。

私の文脈を理解していただければ幸いです。ご不明な点がございましたら、お気軽にお問い合わせください。前もって感謝します。

4

3 に答える 3

2

Bean を使用して@ViewScopedいる場合は、次の変更を行うことができます。

まず、selectOpt1メソッドを次のように変更しますvoid

public void selectOpt1() 
{
    this.list1Val = 1;
    this.list2Val = 1;
    //...
}

アイテムidの選択時に更新するコンポーネントに を付けます。この場合、リスト 1 を仮定します。

<h:selectOneMenu id="list1" value="#{MyClass.list1Val}">
    //...
</h:selectOneMenu>

f:ajaxボタンに、処理のためにそのコンポーネントのみを部分的に送信するタグを追加します。

<h:commandButton value="Select all opt1" action="#{MyClass.selectOpt1}">
    <f:ajax execute="@this" render="list1" />
</h:commandButton>

複数のコンポーネントを更新する予定がある場合は、それらの ID をスペースで区切って追加できます。

<f:ajax execute="@this" render="list1 list2" />

お役に立てば幸いです。

編集

すみません、あなたが JSF 1.x を使っていることに気づきませんでした。この場合、うまくいきません。

ただし、 RichFacesなどのライブラリを使用してajax 機能を追加できます。次のトピックをチェックしてください。

リッチフェイス

あなたが言及したように、RichFaces を使用しているので、f:ajaxタグをa4j:support次のように切り替えることができます。

<h:commandButton value="Select all opt1" action="#{MyClass.selectOpt1}">
    <a4j:support event="onclick" reRender=":list1" ajaxSingle="true" />
</h:commandButton>

または、次のように使用しa4j:commandButtonます。

<a4j:commandButton value="Select all opt1" reRender=":list1" ajaxSingle="true" />

この動作の詳細については、こちらをご覧ください

よろしく。

于 2012-10-10T13:20:34.557 に答える
2

required押されたボタンに属性を依存させるだけです。

<h:form id="form">
    <c:set var="saveButtonPressed" value="#{not empty param['form:save']}" />
    ...
    <h:inputText ... required="#{saveButtonPressed}" />
    ...
    <h:commandButton id="save" ... />
</h:form>
于 2012-10-10T15:11:26.413 に答える