11

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

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

处理方法:

public void onNameChanged(final AjaxBehaviorEvent event)

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

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

4

5 回答 5

21

问题是,我在 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.
}
于 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在您的选择组件上定义 a

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

    关键部分是submit()在值变化时处理封装形式的位。getNewValue()然后,您可以getOldValue()根据需要。

编辑:现在我想起来了,我看不出为什么你不能保持原样并简单地定义valueChangeListener. 它仍然应该在change事件期间处理<p:ajax/>,实际上它会在 ajax 事件本身的侦听器之前处理。

于 2013-02-08T05:18:13.070 回答
0

你可以使用这个:

public void onNameChanged(AjaxBehaviorEvent event)
 {
    String myVal = (String) ((UIOutput) event.getSource()).getValue();
    System.out.println("myVal: " + myVal);
 }
于 2014-12-31T09:39:20.143 回答
-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 回答