我正在使用p:ajax
侦听器来处理值更改事件(因为在表单提交时启动了valueChangeListener
):
<p:ajax event="change" listener="#{bean.onNameChanged}"/>
处理方法:
public void onNameChanged(final AjaxBehaviorEvent event)
问题是,我无法在AjaxBehaviorEvent
及其类层次结构中找到读取输入的旧值的位置。我也不能在谷歌中找到提示,如何获得旧价值......
如何访问p:ajax onChange
事件中的旧值?
答案 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)
您可以尝试以下方法:
在bean中实现值更改事件
public void processValueChange(ValueChangeEvent e){
//foo the bar
}
在您的选择组件上定义valueChangeListener
<p:selectOneMenu value="#{yourBean.value}" onchange="submit()" valueChangeListener="{#yourBean.processValueChange}">
关键部分是submit()
位,在更改值时处理封闭形式。然后,您可以根据需要getNewValue()
和getOldValue()
。
编辑:现在我考虑一下,我认为没有理由不能保持设置原样,只需定义valueChangeListener
即可。它仍应在change
的{{1}}事件期间处理,事实上,它将在ajax事件本身的侦听器之前处理。
答案 3 :(得分:0)
你可以用这个:
public void onNameChanged(AjaxBehaviorEvent event)
{
String myVal = (String) ((UIOutput) event.getSource()).getValue();
System.out.println("myVal: " + myVal);
}