web-dev-qa-db-ja.com

PrimeFaces <p:selectOneMenu>でvalueChangeListenerを呼び出すにはどうすればよいですか?

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がありますか?

ありがとう。

14
Burferd

クライアント側で変更イベントが発生すると、サーバー側のvalueChangeListenerメソッドがすぐに呼び出されることを期待しているようです。これは正しくありません。これは、フォームがサーバーに対してsubmittedであり、新しい値が古い値をequals()しない場合にのみ呼び出されます。

機能要件を達成するには、少なくとも2つの方法があります。

  1. 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風であり、ユーザーエクスペリエンスとしては不十分です。また、必要とは限らない他のすべての入力フィールドを送信(および変換/検証!)します。

  2. 代わりに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引数に置き換えます。

35
BalusC

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"/>
3
Amruta