2013-02-07 169 views
9

我使用p:ajax監聽器來處理值變化事件(因爲valueChangeListener是在形式推出提交):阿賈克斯valueChangeListener

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

handle方法:

public void onNameChanged(final AjaxBehaviorEvent event) 

的問題是,我在AjaxBehaviorEvent中找不到它的類層次結構的地方讀取舊值的輸入。我也無法在google中找到提示,如何獲取舊值...

如何訪問p:ajax onChange事件中的舊值?

回答

15

的問題是,我不能在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. 
} 
+4

+1,有人應該做「BalusC IS AWESOME」視頻(就像「人們真棒」視頻) – Daniel

+0

Bauke你是驚人的人:D你剛剛救了我幾個小時的頭撓。 – xwinus

+2

像往常一樣,BalusC在我擁有它之前已經解決了我的問題。 – Herick

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()

編輯:現在,我想想,我看不出有任何理由爲什麼你不能離開你的設置作爲 - 是簡單地定義valueChangeListener。它應該仍然在change事件<p:ajax/>期間處理,事實上,它將在Ajax事件本身的偵聽器之前處理。

+0

不,提交不能做(因爲驗證),並改變後場的變化,必須對其他組件是可見的,所以它不是一個解決方案) –

+0

@lechlukasz:您可以按照「編輯」 - kolossus答案的一部分進行部分提交。然後,valueChangeListener將被調用,您可以訪問舊值和新值。所有其他表單元素將不會被評估/處理(除非您將它放在ajax調用的'execute'屬性中。) –

+0

不幸的是,valueChangeListener在p:ajax之前被調用,所以我沒有來自表單中的實際數據方法,所以理論上我可以使用valueChangeListener記住舊的值,然後等待p:ajax來處理... –

5

的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()); 
} 

,如果我從 「你好」 改變文本框上面的代碼將打印到「世界」:

valueChangeListener調用:OLD:您好新:世界

+0

你知道如何讓服務器代碼可見的bean更改?與p:ajax我有過程選項,發送UI控件的內容,以他們處於最後提交狀態... –

+0

@lechlukasz:看看BalusC的答案。 –

0

您可以使用此:

public void onNameChanged(AjaxBehaviorEvent event) 
{ 
    String myVal = (String) ((UIOutput) event.getSource()).getValue(); 
    System.out.println("myVal: " + myVal); 
} 
+1

OP在更新模型值階段發生之前就已經對「**舊**值」感興趣了。然而,ajax監聽器在更新模型值階段之後運行*。請參閱目前接受的正確答案。 – BalusC