2013-02-07 170 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