valueChangeListener的Ajax

时间:2013-02-07 11:36:53

标签: ajax jsf jsf-2 primefaces onchange

我正在使用p:ajax侦听器来处理值更改事件(因为在表单提交时启动了valueChangeListener):

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

处理方法:

public void onNameChanged(final AjaxBehaviorEvent event)

问题是,我无法在AjaxBehaviorEvent及其类层次结构中找到读取输入的旧值的位置。我也不能在谷歌中找到提示,如何获得旧价值......

如何访问p:ajax onChange事件中的旧值?

4 个答案:

答案 0 :(得分:19)

  

问题是,我在AjaxBehaviorEvent中找不到它的类层次结构来读取旧值的输入。我也不能在谷歌中找到提示,如何获得旧价值......

使用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.
}

答案 1 :(得分:6)

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:OLD:hello NEW:world

答案 2 :(得分: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()

  3. 编辑:现在我考虑一下,我认为没有理由不能保持设置原样,只需定义valueChangeListener即可。它仍应在change的{​​{1}}事件期间处理,事实上,它将在ajax事件本身的侦听器之前处理。

答案 3 :(得分:0)

你可以用这个:

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