1

h:selectOneListbox属性を持つ がありますrequired="true"。クライアント側の検証は正常にa4j:ajax機能します。

有効な選択が行われると、別のパネルグループがレンダリングされます。

例:

<h:selectOneListbox 
....
id="first" 
....
 required="true"
>
<a4j:ajax event="valueChange"  render="secondGroup" listener="#{myController.anotherMethodINeed}"/>
</h:selectOneListbox>

<!-- the other panel -->


<h:panelGroup id="secondGroup" layout="none">
     <h:panelGroup id="secondGroupCheck" layout="none" rendered="#{not empty model.first}">

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

これも機能します。

問題は次のとおりです。

ユーザーが最初の選択ボックスで不正な値 (空の値など) を選択した場合、入力はクライアント側で検証されます。したがって、情報がモデルに到達することはありません。最初の有効な入力の後、パネルは常にレンダリングされます。サーバーは変更を認識しないため、再度非表示にする方法はありません。

私が知っている唯一の回避策は、そのようなフィールド用のカスタム バリデータを作成することです。パネルをレンダリングする必要がある場合、バリデーターはフラグを設定します。このフラグを使用して、パネルグループをレンダリングするかどうかを決定できます。

これを行うよりスマートな方法はありませんか?

すべてのフィールドをチェックするようなものを使用できることは知っていrendered="#{not facesContext.validationFailed}"ますが、1 つのフィールドだけをチェックする方法はわかりません。

4

1 に答える 1

1

UIInputコンポーネントが検証フェーズ中に をスローするとValidatorException、JSF は自動的に を呼び出しUIInput#setValid()ますfalse。したがってUIInput#isValid()、ビューで使用して、特定のコンポーネントが検証に合格したかどうかを確認できることを意味します。

属性を使用しbindingてコンポーネントをビューにバインドしUIInput、通常の EL 方法でそのすべてのプロパティにアクセスできます。

<h:selectOneListbox id="first" binding="#{first}" ... required="true">
    ...
    <a4j:ajax listener="#{myController.anotherMethodINeed}" render="secondGroup" />
</h:selectOneListbox>

<h:panelGroup id="secondGroup">
    <h:panelGroup id="secondGroupCheck" rendered="#{not empty model.first and first.valid}">
        ...
    </h:panelGroup>
</h:panelGroup>

ちなみにlayout="none"は の無効な属性な<h:panelGroup>ので省略しました。また、event="valueChange"はすでに<a4j|f:ajax>内部UIInputコンポーネントのデフォルトであるため、省略しました。

于 2013-01-04T12:49:24.547 に答える