我正在使用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
您可以尝试以下操作:
-
在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事件本身的侦听器之前进行处理。
您可以使用这个:
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
}