0

無効なフィールドに適用されるrequired=true検証に問題があります。

a4j:commandButton と、フォーム内に州のリストと国のリストを含む 2 つのドロップダウンがあります。どちらのドロップダウンにも required="true" 検証が適用されています。以下に示すように、タグ属性 disabled="true" を使用することで、州のドロップダウンが有効になり、国のドロップダウンがデフォルトで無効になります。

<h:selectOneMenu value="#{states}" required="true">
  <f:selectItems>
</h:selectOneMenu>

<h:selectOneMenu value="#{countries}" disabled="true" required="true">
  <f:selectItems>
</h:selectOneMenu>

シナリオ 1:状態ドロップダウンで何も選択せずに a4j:commandButton をクリックします。 結果:予期される状態ドロップダウンの必須フィールド検証エラー

ラジオ ボタン (フォームの外側) をクリックすると、州のドロップダウンが無効になり、以下に示すように jquery/javascript を使用して国のドロップダウンが有効になります。

$j('#stateDropdown').attr('disabled', 'disabled');
$j('#countryDropdown').removeAttr('disabled');

シナリオ 2:国ドロップダウンで何も選択せずに a4j:commandButton をクリックします。 結果:州と国の両方のドロップダウンで必須フィールドの検証エラーが発生しました。ただし、国ドロップダウンの検証エラーのみが予期されていました。

<h:selectOneMenu>実行時に for タグによって生成された html コード:

jsf タグ属性を使用してドロップダウンを無効にする場合:<select disabled="disabled">...</select>

jqueryを使用してドロップダウンを無効にする場合:<select disabled="">...</select>

jqueryによって無効にされたフィールドをjsfが検証している理由を誰かが知っていますか?

4

1 に答える 1

0

UIComponentJSF は、ご想像のとおり、クライアント側の HTML DOM ツリーではなく、サーバー側の JSF ツリーに基づいて検証を行います。jQuery を使用すると、状態の変更を JSF に通知せずに、クライアント側で HTML DOM ツリーを変更するだけで、コンポーネント ツリーに反映できるようになります。

jQueryの代わりにJSFを使用して無効/有効にする必要があります。Ajax4jsfを使用しているので、これに使用できますa4j:support

<h:selectOneMenu value="#{bean.state}" required="true">
    <f:selectItems value="#{bean.states}" />
    <a4j:support event="change" reRender="country" />
</h:selectOneMenu>
<h:selectOneMenu id="country" value="#{bean.country}" required="true" disabled="#{bean.countryDisabled}">
    <f:selectItems value="#{bean.countries}" />
</h:selectOneMenu>

この例で<a4j:support>は、州のドロップダウンが変更されるたびに国のドロップダウンが再レンダリングされます。国ドロップダウンにはdisabled、ブール Bean プロパティにアタッチされた属性があります。現在選択されている状態に基づいて、目的の結果が返されることを確認する必要があります。valueChangeListenergetter メソッドまたは状態ドロップダウンでそれを行うことができます。

于 2010-09-23T11:37:19.310 に答える