1

2 つの DIV にまたがるフィールドを持つマルチ フィールド バリデーターがあります。フィールド間で値をバインドし、それを属性としてバリデーターの 1 つに渡そうとすると、送信された値が取得されません。バリデーターですが、バリデーターに行くと、送信された値はnullになります。

「phone1」、「phone2」、「phone3」という 3 つの div があり、これら 3 つのフィールドのフィールド「phone3」で検証したいと考えています。バリデーターは、送信された左フィールドと中央フィールドの値を取得しません。div「phone3」内に追加の入力フィールド「確認」を追加し、バリデーターは「確認」フィールドの値を取得します

<div class="home_phone">

        <div id="phone1" >
        <div class="left"></div>
        <div class="middle">
            <h:inputText id="phonePrefix"
                maxlength="4" value="#{phoneNumberTO.phonePrefix}"
                immediate="true"
                binding="#{phonePrefix}">
            </h:inputText>
        </div>
        <div class="right"></div>

</div>
        <div id="phone2" >


        <div class="left"></div>
        <div class="middle">
            <h:inputText  id="phoneAreaCode"
                maxlength="4" 
                immediate="true"
                binding="#{phoneAreaCode}">
            </h:inputText>
        </div>
        <div class="right"></div>
</div>
        <span class="sep_field">-</span>
        <div id="phone3" >

        <div class="left"></div>
        <div class="middle">
            <h:inputText  id="input3"
                maxlength="4" value="#{phoneNumberTO.phoneSuffix}"
                >
                <f:validator validatorId="phoneValidator"  />
                <f:attribute name="phonePrefix" value="#{phonePrefix}"   /> 
             <f:attribute name="phoneAreaCode" value="#{phoneAreaCode}"   />
                             <f:attribute name="confirm" value="#{confirm}"   />
            </h:inputText>
             <h:inputSecret id="confirm" binding="#{confirm}" required="true" />
        </div>
        <div class="right"></div>

</div>



    </div>
4

1 に答える 1

2

immediate=true最初の 2 つのコンポーネントで使用しました。それ以外の場合は検証され、submitValue は NULL になります

いいえ、これはimmediate="true"目的ではありません。それを除く。

JSF では、コンポーネントは JSF コンポーネント ツリーに表示される順序で処理され、変換/検証されます。すべての単一の入力コンポーネントは、次のように、検証段階で段階的に変換および検証されます。

  • コンポーネントの送信された値を取得するUIInput#getSubmittedValue()
  • コンポーネントの送信された値を一時値に変換します。
  • 一時値を検証します。
    • 検証が成功した場合、temp 値をコンポーネントの値として保存し、コンポーネントの送信された値をbyUIInput#setValue() 設定します。nullUIInput#setSubmittedValue()
    • 検証が失敗した場合は、一時値を破棄し、 に渡すfalseことによってコンポーネントを無効に設定しますUIInput#isValid()。送信された値はコンポーネントに保持されることに注意してください!

ビューにある順序で、最後のUIInput#getValue()コンポーネントにバリデーターを使用して、他の入力の値を の代わりに収集する必要があります。そうしないと、検証が成功したときにUIInput#getSubmittedValue()実際に s を取得し続けます。null

UIInput phonePrefix = (UIInput) component.getAttributes().get("phonePrefix");
Object value = phonePrefix.getValue(); // Don't use getSubmittedValue().

今のところ、divの外に置いたときになぜうまくいったのか説明できません。実際、コンポーネントの順序を誤って再配置したと思います。


属性の適切な使用法についてはimmediate="true"、正確に何をするのかを理解していると役立ちます。デバッグ JSF ライフサイクルの記事からの関連性の抜粋を次に示します。

では、immediate 属性はいつ使用すればよいでしょうか。

まだ完全に明確でない場合は、ここに要約を示し、有益な場合の実際の使用例を示します。

  • (s) のみに設定されている場合UIInput、プロセスの検証フェーズは代わりにリクエスト値の適用フェーズで行われます。UIInputこれを使用して、問題のコンポーネントの検証に優先順位を付けます。いずれかの検証/変換が失敗した場合、非即時コンポーネントは検証/変換されません。

  • 設定されている場合UICommandのみ、リクエスト値の適用フェーズは、モデル値の更新フェーズまでスキップされますUIInput。これを使用して、フォームの処理全体をスキップします。たとえば、「キャンセル」または「戻る」ボタン。

  • UIInputコンポーネントとコンポーネントの両方で設定されている場合、この属性が設定されていないコンポーネントUICommandについては、モデル値の更新フェーズがスキップされるまで、リクエスト値の適用フェーズがスキップされます。UIInputこれを使用して、特定のフィールドを除いてフォーム全体の処理をスキップします (即時)。たとえば、必須ではあるが即時ではないパスワード フィールドを含むログイン フォームの「パスワードを忘れた」ボタン。

于 2012-05-18T18:58:27.953 に答える