用于 valueChangeListener 的 Ajax

Posted

技术标签:

【中文标题】用于 valueChangeListener 的 Ajax【英文标题】:Ajax for valueChangeListener 【发布时间】:2013-01-22 21:32:31 【问题描述】:

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

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

处理方法:

public void onNameChanged(final AjaxBehaviorEvent event)

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

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

【问题讨论】:

【参考方案1】:

您可以尝试以下方法:

    在您的 bean 中实现值更改事件

     public void processValueChange(ValueChangeEvent e)
     //foo the bar
     
    

    在你的选择组件上定义一个valueChangeListener

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

    其中的关键部分是submit() 位,该位在值更改时处理封闭形式。然后,您可以根据需要 getNewValue()getOldValue()

编辑:现在我想了想,我认为你没有理由不能让你的设置保持原样并简单地定义valueChangeListener。还是应该在&lt;p:ajax/&gt;中的change事件期间处理的,其实是在ajax事件本身的监听之前处理的。

【讨论】:

不,提交不能完成(因为验证)并且更改字段后必须对其他组件可见,所以不是解决方案) @lechlukasz:您可以按照 kolossus 答案的“编辑”部分中的说明进行部分提交。然后 valueChangeListener 将被调用,您可以访问旧值和新值。不会评估/处理所有其他表单元素(除非您将其放在 ajax 调用的 execute 属性中。) 不幸的是,valueChangeListener 在 p:ajax 之前被调用,所以我没有来自该方法中表单的实际数据,所以理论上我可以使用 valueChangeListener 来记住旧值,然后等待 p: ajax 来处理...【参考方案2】:

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

【讨论】:

您知道如何使 bean 更改也对服务器代码可见吗?使用 p:ajax 我有进程选项,可以发送 UI 控件的内容,这样它们就处于上次提交的状态... @lechlukasz:看看 BalusC 的回答。【参考方案3】:

问题是,我在 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.

【讨论】:

+1,有人应该做“BalusC IS AWESOME”视频(就像“PEOPLE ARE AWESOME”视频一样) Bauke 你是个了不起的家伙 :D 你刚刚为我节省了几个小时的挠头时间。 像往常一样,BalusC 在我拥有它之前就已经为我解决了问题。 @BalusC,谢谢你的回答,'JSF 是宗教-BalusC 是上帝。'【参考方案4】:

你可以用这个:

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

【讨论】:

OP 对“ 值”感兴趣,因为它更新模型值阶段已经发生。然而,ajax 侦听器在 更新模型值阶段运行。请参阅当前接受的答案以了解正确的方法。

以上是关于用于 valueChangeListener 的 Ajax的主要内容,如果未能解决你的问题,请参考以下文章

选择组件上的 Vaadin ValueChangeListener 无法正常工作

Valuechangelistener上 有效,但正在抛出异常。为什么?

何时使用 valueChangeListener 或 f:ajax 监听器?

结合接缝 3 和 JSF2 复合组件 valueChangeListener 评估 El 表达式的问题

当初始值为空字符串且新值为 null 时调用 valueChangeListener

Primefaces valueChangeListener 或 <p:ajax 侦听器未触发 p:selectOneMenu [重复]