Ajax for valueChangeListener



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

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

处理方式:

public void onNameChanged(final AjaxBehaviorEvent event)

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

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

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

使用valueChangeListener


不幸的是,valueChangeListener是在p:ajax之前调用的,所以我在该方法中没有来自表单的实际数据,所以理论上我可以使用valueChangeListeners记住旧值,然后等待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.
}

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

您可以尝试以下操作:

  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。它仍然应该在<p:ajax/>中的change事件期间进行处理,事实上,它将在ajax事件本身的侦听器之前进行处理。

您可以使用这个:

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

可以进行变通(使用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事件处理程序。

Bean方法:

public void onNameChanged(final AjaxBehaviorEvent event) {
    String oldValue = getFacesContext().getExternalContext().getRequestParameterMap()
                      .get("oldValue");
    //Do with oldValue, whatever you want
}

相关内容

  • 没有找到相关文章

最新更新