web-dev-qa-db-ja.com

Primefaces selectOneRadio ajax

ユーザーがラジオボタンをクリックするたびに検証メッセージを表示しようとしています。

これは送信ボタンをクリックしたときにのみ機能しますが、ラジオボタンをクリックしたときは機能しません:

    <h:form id="form">
        <p:panel id="panel">
            <ui:repeat value="#{questionsBean}" var="question">
                <h:panelGrid columns="3" style="margin-bottom:10px" cellpadding="5">
                    <h:outputText value="#{question.questionText}" />
                    <p:selectOneRadio id="question" value="#{question.response}"
                        validator="#{question.validate}" required="true">
                        <f:selectItem itemLabel="Yes" itemValue="Yes" />
                        <f:selectItem itemLabel="No" itemValue="No" />
                        <p:ajax update="msgQuestion" event="change"/>
                    </p:selectOneRadio>
                    <p:message for="question" id="msgQuestion" />
                </h:panelGrid>
            </ui:repeat>
            <p:commandButton id="btn" value="Save" update="panel" partialSubmit="true"/>
        </p:panel>
    </h:form>
16
DD.

HTML DOM changeイベントは、ラジオボタン(またはチェックボックス)がクリックされたかどうかをリッスンしたい場合、間違ったイベントです。これにはclickイベントを使用する必要があります。

ラジオボタン(およびチェックボックス)の値は基本的に変更されません。常に同じ値を持ちます。問題は、その値がサーバー側に送信されるかどうかです。これは、通常DOM clickイベントによってトリガーされる「チェック済み」状態によって決まります。

ラジオボタン/チェックボックスでのchangeイベントの実際の動作は、使用するWebブラウザーに依存します。 IEブラウザーでは、動作に特に一貫性がありません。使用するバージョンだけでなく、使用するレンダリングモード(互換モードと標準モード)にも依存します。おそらく、テスト中に実際にIEを使用していたのでしょう。

デフォルトのeventタイプのPrimeFaces <p:ajax>(および標準のJSF <f:ajax>)は、valueChangeで既にこれを自動的にカバーします。

<p:ajax update="msgQuestion" event="valueChange" />

これにより、テキスト入力とドロップダウンで正しいchangeイベントハンドラー、ラジオボタンとチェックボックスでclickイベントハンドラーが自動生成されます。

しかし、既に述べたように、それはすでにデフォルトeventタイプです。単に完全に省略します。

<p:ajax update="msgQuestion" />
32
BalusC