11

リスナーを使用してp:ajax値変更イベントを処理しています (valueChangeListenerフォーム送信時に起動されるため):

<p:ajax event="change" listener="#{bean.onNameChanged}"/>

ハンドル方法:

public void onNameChanged(final AjaxBehaviorEvent event)

問題は、入力の古い値AjaxBehaviorEventを読み取る場所がクラス階層にも見つからないことです。古い値を取得する方法も、Googleでヒントを見つけることができませんでした...

p:ajax onChangeイベントで古い値にアクセスする方法は?

4

5 に答える 5

21

問題は、AjaxBehaviorEvent にもそのクラス階層にも、入力の古い値を読み取る場所が見つからないことです。古い値を取得する方法も、Googleでヒントを見つけることができませんでした...

を使用しvalueChangeListenerます。


残念ながら、valueChangeListener は p:ajax の前に呼び出されるため、そのメソッドにはフォームからの実際のデータがないため、理論的には valueChangeListener を使用して古い値を記憶し、p:ajax が処理されるのを待つことができます...

値変更イベントをアプリケーション呼び出しフェーズにキューイングします。

public void valueChangeListenerMethod(ValueChangeEvent event) {
    if (event.getPhaseId() != PhaseId.INVOKE_APPLICATION) {
        event.setPhaseId(PhaseId.INVOKE_APPLICATION);
        event.queue();
        return;
    }

    // Do your original job here. 
    // It will only be invoked when current phase ID is INVOKE_APPLICATION.
}
于 2013-02-08T11:20:58.967 に答える
7

ValueChangeListener は次のように動作する必要があります。

景色:

<h:form>
  <h:inputText value="#{sessionBean.hello}" 
               valueChangeListener="#{sessionBean.valueChangeListener}">
    <p:ajax/>
  </h:inputText>
</h:form>

豆:

public void valueChangeListener(ValueChangeEvent e) {
  System.out.println("valueChangeListener invoked:" 
                      + " OLD: " + e.getOldValue() 
                      + " NEW: " + e.getNewValue());
}

テキストフィールドを「hello」から「world」に変更すると、上記のコードが出力されます。

呼び出された valueChangeListener: 旧: こんにちは 新: 世界

于 2013-02-08T10:59:21.473 に答える
3

次のことを試すことができます。

  1. Bean に値変更イベントを実装する

     public void processValueChange(ValueChangeEvent e){
     //foo the bar
     }
    
  2. valueChangeListener選択コンポーネントに を定義します

     <p:selectOneMenu value="#{yourBean.value}" onchange="submit()" valueChangeListener="{#yourBean.processValueChange}">
    

    重要な部分はsubmit()、値の変更時に囲んでいるフォームを処理するビットです。その後getNewValue()getOldValue()必要に応じて実行できます。

編集:考えてみると、セットアップをそのままにして、単に を定義できない理由はわかりませんvalueChangeListenerchangeのイベント中に引き続き処理する必要があります<p:ajax/>。実際には、ajax イベント自体のリスナーの前に処理されます。

于 2013-02-08T05:18:13.070 に答える
-1

回避策は可能です (Primefaces 10 でテスト済み):

<p:inputText id="name" value="bean.name">
     <p:ajax event="valueChange" update="name"
             listener="#{bean.onNameChanged}"
             onstart="cfg.ext={params:[{name:'oldValue', value:'#{bean.name}'}]};"/>
</p:inputText>

update="name"毎回新しい値を JavaScript イベント ハンドラーに取得することが重要です。

豆の方法:

public void onNameChanged(final AjaxBehaviorEvent event) {
    String oldValue = getFacesContext().getExternalContext().getRequestParameterMap()
                      .get("oldValue");
    //Do with oldValue, whatever you want
}
于 2022-01-24T10:50:34.640 に答える