用于 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
。还是应该在<p:ajax/>
中的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 [重复]