当初、フラグはインターフェースimmediate
のみを対象としていました。ActionSource
しかし、後でそれはEditableValueHolder
インターフェースにも追加されました。デザインを決定した理由は何ですか?
1 に答える
EditableValueHolder
これは、同じフォーム内の複数のコンポーネントの検証に優先順位を付けるために使用されます。
immediate="true"
この属性を持つ入力コンポーネントと含まない入力コンポーネントを含むフォームを想像してみてください。即時入力は、リクエスト値の適用フェーズ(通常より1フェーズ早い)で検証されます。非即時入力は、検証フェーズ(通常のフェーズ)で検証されます。即時入力の少なくとも1つで検証が失敗した場合、非即時入力は変換/検証されないため、変換/検証エラーメッセージは生成されません。これは、(即時の)コンポーネントXの検証が失敗したときに、コンポーネントYを検証する意味がない複雑な検証ルールを持つフォームで特に役立ちます。
同じ形式のコマンドボタンと組み合わせて使用immediate="true"
すると、すべての非即時入力が完全にスキップされます。実例としては、「ユーザー名」と「パスワード」の2つのフィールドと、required="true"
「ログイン」と「パスワードを忘れた」の2つのボタンがあるログインフォームがあります。immediate="true"
「ユーザー名」フィールドと「パスワードを忘れた」ボタンを押すと、パスワードフィールドのチェックをスキップできrequired="true"
ます。
暗いJSF1.xの時代には、カスケードドロップダウンリストで、およびとimmediate="true"
組み合わせてハックとして使用されることもよくありました。簡単に言えば、これはそれに関する古いブログ記事です。つまり、開発者は、同じフォームの他のすべての入力を検証しなくても、変更時にバッキングBeanメソッドを実行できます。しかし、最近では、ajaxの素晴らしさにより、このハックは不要です。このケースの具体的な例は、ウィキページの下部にあります。valueChangeListener
FacesContext#renderResponse()
<h:selectOneMenu>
<h:selectOneMenu>
最近immediate="true"
でも、「神の形」のアンチパターンのログアウトボタンなど、他のすべての入力を完全にバイパスする特定のボタンを使用するために(ab)使用されることがよくあります(これにより、すべてが巨大にまとめられます<h:form>
)。または、フォームを誤って送信するキャンセルボタン。immediate="true"
このようなボタンは、入力の1つで正しい方法が実際に必要になると壊れます。このようなログアウトボタンを独自の形式にするか、(process="@this"
PrimeFacesで)それ自体のみを処理するように変更することをお勧めします。また、このようなキャンセルボタンを変更して、ページをで同期的に更新することをお勧めします<h:button value="Cancel" />
。これは、フォームがリクエスト/ビュースコープのBeanに関連付けられており、動的ページでブラウザのキャッシュが無効になっている場合に正常に機能します。