PF 3.0-RC1スナップショットの使用(2011年1月22日)
複合コンポーネントを使用しています。選択が行われたときにvalueChangeListenerを呼び出したいのですが、リスナーを呼び出していないようです。
コンポーネントのコードは次のとおりです。
<p:selectOneMenu style="width: 220px;"
value="#{customerProfileSessionBean.selectedAccount}"
valueChangeListener="#{customerProfileSessionBean.accountValueChange}" >
<f:selectItems value="#{sessionBean1.custAccountList}"/>
</p:selectOneMenu>
バッキングBeanのリスナーに、呼び出されていない印刷ステートメントがあります(少なくともサーバーログには表示されません)。
値が変更されたときにvalueChangeListenerが呼び出されるようにするために他に必要なことはありますか?使用する必要がありますか?
また、リスナーには、渡されるValueChangeEventがありますか?
ありがとう。
クライアント側で変更イベントが発生すると、サーバー側のvalueChangeListener
メソッドがすぐに呼び出されることを期待しているようです。これは正しくありません。これは、フォームがサーバーに対してsubmittedであり、新しい値が古い値をequals()
しない場合にのみ呼び出されます。
機能要件を達成するには、少なくとも2つの方法があります。
onchange="submit()"
を追加して、値を変更するたびにJavaScriptがフォームを送信するようにします。
<p:selectOneMenu style="width: 220px;"
value="#{customerProfileSessionBean.selectedAccount}"
valueChangeListener="#{customerProfileSessionBean.accountValueChange}"
onchange="submit()">
<f:selectItems value="#{sessionBean1.custAccountList}"/>
</p:selectOneMenu>
ただし、これは非常にJSF-1.x風であり、ユーザーエクスペリエンスとしては不十分です。また、必要とは限らない他のすべての入力フィールドを送信(および変換/検証!)します。
代わりにajaxリスナーを使用してください。実際の値の変更には興味がない(つまり、古い値は興味がない)かどうかは確かですが、実際にはchangeイベント自体に興味があります。これを行うには、<f:ajax>
を使用するか、PrimeFacesコンポーネントで<p:ajax>
を使用します。
<p:selectOneMenu style="width: 220px;"
value="#{customerProfileSessionBean.selectedAccount}">
<p:ajax listener="#{customerProfileSessionBean.accountValueChange}" />
<f:selectItems value="#{sessionBean1.custAccountList}"/>
</p:selectOneMenu>
そして、ValueChangeEvent
引数をAjaxBehaviorEvent
引数に置き換えます。
P:selectOneMenuにf:ajaxステートメントを追加すると、ajax呼び出しが作成され、値が送信されますEX:
<p:selectOneMenu style="width: 220px;" value="#
{customerProfileSessionBean.selectedAccount}"
valueChangeListener="#{customerProfileSessionBean.accountValueChange}" >
<f:selectItems value="#{sessionBean1.custAccountList}"/>
<f:ajax render="@form"/>
</p:selectOneMenu>
または、次のようにフォーム全体をレンダリングしたくない場合は、パネルIDまたはデータテーブルIDを指定できます。
<f:ajax render=":formid:panelGroupId"/>