1

私はJSFを初めて使用し、奇妙な問題に遭遇しました。解決方法がわかりません。

画面に複数のタブがあり、そのうちの 1 つにテキスト フィールド、ドロップダウンなどがあります。すべてのテキスト フィールドとドロップダウンには、required="true"が設定されています。

この検証のため、値を入力または選択せずに別のタブに移動しようとすると、移動できず、検証メッセージ ( value is required ) が表示されます。

しかし、タブに保存ボタンがあります。タブの切り替え/ナビゲーション中ではなく、保存ボタンをクリックしたときにのみ検証がトリガーされます。保存ボタンをクリックすると検証が機能する間、別のタブに切り替えたときに検証がトリガーされないようにするだけです。

この検証では、別のタブに切り替えることができず、タブを切り替えたときにこの検証がトリガーされる理由がわかりません。

誰でも私の問題の解決策を提案してください。


更新: CycDemo の回答に基づいて行った変更は次のとおりです。

<h:tab name="First Tab" accessKey="s">
    <h:panelGroup >
    <h:dataTable id="firstTable" styleClass="dataTableEx" headerClass="headerClass"
                footerClass="footerClass" rowClasses="rowClass1,rowClass2"
                columnClasses="columnClass1" value="#{clientProductCRUDBean.model}"
                var="item" border="1"  cellpadding="2" cellspacing="0" >

                <!-- this for the incoming originator type dropdown field -->

                <h:column>
                    <f:facet name="header">
                        <h:outputText value="firstDropDown" />
                    </f:facet>
                     <h:selectOneMenu id="firstDropDown"  
                                required="true" requiredMessage="required field" immediate="true" >
                            <f:selectItem itemLabel="--Select--" itemValue="#{null}" />
                            <h:message for="firstDropDown" errorClass="generalErrorText"/>
                    </h:selectOneMenu>  
                </h:column>                                 


                <!-- this for the outgoing originator text field -->

                <h:column >
                    <f:facet name="header">
                        <h:outputText value="firstTextField"/>
                    </f:facet>
                    <h:inputText id="firstTextField"
                    required="true" validatorMessage="Max Length 20" requiredMessage="required field" immediate="true" >
                    <f:validateLength maximum="20"/>
                    <h:message for="firstTextField" errorClass="generalErrorText"/>
                    </h:inputText>
                </h:column>

            <!-- this for the replace or randomise radio buttons text field -->

                    <!-- this for the operators selection drop down-->

                </h:dataTable>
    </h:panelGroup>

    <h:panelGroup style="padding: 1px;  margin-top: 5px;" >
                <h:commandButton id="firstSaveButton" styleClass="commandButton"  value="Save" />
                <h:commandButton id="firstSaveCancel" styleClass="commandButton" value="Cancel" immediate="true"/>
    </h:panelGroup>
    <br />
</h:tab>

それでも検証が呼び出されます。

4

2 に答える 2

3

switch/navigation検証プロセスを使用しない場合はimmediate="true"、アクションコンポーネントで使用する必要があります。

たとえば、次のようになります。

<h:commandButton value="Save" />
<h:commandButton value="NextPage" immediate="true"/>

ボタンをクリックSaveすると、検証プロセスが機能します。ただし、NextPageクリックされた検証プロセスは克服されます。

immediate="true"入力コンポーネント がある場合はNextPage、ボタンをクリックしても、そのコンポーネントに対して検証プロセスが実行されます。

<h:inputText id="name" value="#{...}" immediate="true" required="true">
<h:commandButton value="Save" />
<h:commandButton value="NextPage" immediate="true"/>

ボタンをクリックNextPageすると、の検証プロセス<h:inputText id="name"...>が実行されます。質問があるかもしれませんが、なぜ彼らはそれを好むのですか?答えはあなたが学ばなければならないということJSF Life Cycleです。

于 2012-11-01T10:55:04.207 に答える
0

を使用し<rich:tabPanel、 をクライアントに変更switchTypeします。次に、その<rich:tab>中で s を使用します。

<rich:tabPanel switchType="client">
      <rich:tab>
            …………
      </rich:tab>
</rich:tabPanel>

于 2012-11-01T15:45:06.310 に答える