2011-12-06 6 views
12

PF 3.0-RC1の使用スナップショット(2011/11/22)PrimeFaces <p:selectOneMenu>でvalueChangeListenerを呼び出す方法を教えてください。

私には複合コンポーネントがあります。 選択が行われたときにvalueChangeListenerを呼び出すが、リスナーを呼び出すようには見えない。ここで

コンポーネントのコードです:

<p:selectOneMenu style="width: 220px;" 
     value="#{customerProfileSessionBean.selectedAccount}" 
     valueChangeListener="#{customerProfileSessionBean.accountValueChange}" > 
    <f:selectItems value="#{sessionBean1.custAccountList}"/> 
</p:selectOneMenu> 

リスナーバッキングBeanで(少なくとも私は、サーバーのログにそれを見ることはありません)と呼ばれていないprint文を持っています。

値が変更されたときにvalueChangeListenerを呼び出すには、何か他に必要なことはありますか? 私は使用する必要がありますか?

また、リスナーには、ValueChangeEventが渡されていますか?

ありがとうございました。

答えて

34

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

あなたの機能要件を実現するには、少なくとも2つの方法があります:あなたが値を変更するたびJavaScriptがフォームを送信するように

  1. onchange="submit()"を追加します。

    <p:selectOneMenu style="width: 220px;" 
        value="#{customerProfileSessionBean.selectedAccount}" 
        valueChangeListener="#{customerProfileSessionBean.accountValueChange}" 
        onchange="submit()"> 
        <f:selectItems value="#{sessionBean1.custAccountList}"/> 
    </p:selectOneMenu> 
    

    しかし、これは非常にJSFであります-1.x-ishであり、ユーザの経験に乏しい。また、他のすべての入力フィールドは、あなたが望むものではないかもしれないので、提出します(そして変換/検証します)。

  2. 実際の値の変更に興味がない(つまり、古い値が面白くない)場合は、実際に変更イベント自体に興味があるかどうかを確認するために、代わりにajaxリスナーを使用してください。あなたはこの<p:ajax>を使用して<f:ajax>またはPrimeFacesコンポーネントでを使用して行うことができます。

    <p:selectOneMenu style="width: 220px;" 
        value="#{customerProfileSessionBean.selectedAccount}"> 
        <p:ajax listener="#{customerProfileSessionBean.accountValueChange}" /> 
        <f:selectItems value="#{sessionBean1.custAccountList}"/> 
    </p:selectOneMenu> 
    

    をそしてAjaxBehaviorEvent引数でValueChangeEvent引数を交換してください。

+0

ありがとうございました。私はPrimeFacesコンポーネントに、コンポーネントのajax動作の一部としてsubmit()を実行することを期待していました。 – Burferd

+6

あなたのselcondの解決策は非常にうまくいっていましたが、 ' devsnd

+1

BalusCはスポットです。私はそれが合法であるかどうかわかりませんが、もっと楽しいですが、メニュー内にを挿入し、メニューのvalueChangeListener属性をそのままのままにしておきます。何らかの理由で、項目が変更されると、ajaxはvalueChangeEventを発生させます。私はこれを徹底的にテストしてロケールに即座に変更を加え、それは夢のように働きます。 –

3

Fを追加します:pのAJAX声明:selectOneMenuを、それはAJAX呼び出しを作成し、あなたの価値はEX提出されます。

​​

をそれとも、いけない場合は、パネルIDやデータテーブルのidを提供することができます

<f:ajax render=":formid:panelGroupId"/> 
関連する問題