问题描述
||
我目前遇到一种奇怪的现象,即在执行valuechangelistener之前将值设置为模型。
基本上我想发生的是:
我改变选择菜单
使用Ajax提交新值以更新myBean(使用f:ajax)
根据新提交的值执行查询(使用valuechangelistener)
根据上一次查询的结果呈现表
但是,当我按此顺序运行时会发生什么,即1-3-2-4(不是我想象的1-2-3-4)
这是用户界面的一部分:
<h:selectOneMenu label=\"budget\" id=\"budget\"
converter=\"genericConverter\"
value=\"#{myBean.budget}\"
valuechangelistener=\"#{myBean.actionSearch}\">
<f:ajax render=\"myGrid\" />
<f:selectItem itemLabel=\"Choose one ..\" noSelectionoption=\"true\" />
<f:selectItems ... />
</h:selectOneMenu>
这是摘自bean的摘录:
public void actionSearch() {
System.out.println(\"searching with this.budget == \" + this.budget);
...
}
public void setBudget(String budget) {
System.out.println(\"setting budget : \" + budget);
this.budget = budget;
}
这是输出:
searching with this.budget == xxxx
setting budget : yyyy
我想要的是,首先根据用户界面中选择的新值设置预算,然后根据新用户界面开始搜索。但是我不知道该怎么实现。
即时通讯与这些一起使用Tomcat 7:
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.0.4-b09</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.0.4-b09</version>
<scope>compile</scope>
</dependency>
我想知道我做错了什么吗?
谢谢 !
解决方法
valueChangeListener
在“验证模型”阶段执行,在“更新模型值”阶段之前执行。旨在能够同时处理旧值和新值,以便您在必要时可以根据实际更改进行一些业务工作(记录?)。然而,在JSF 1.x中,这种用法通常仅用于对下拉更改进行调用,而不是经常用于,但必须与onchange=\"submit()\"
,immediate=\"true\"
,FacesContext#renderResponse()
和其他内容结合使用。所选值将由ValueChangeEvent#getNewValue()
获得(ValueChangeEvent
应定义为方法的参数)。
对于JSF 2.x,在这种情况下,您不再需要valueChangeListener
。无论如何,您也不会对旧值感兴趣。请改用<f:ajax>
的listener
属性。
<f:ajax listener=\"#{bean.actionSearch}\" />
这将在“更新模型值”阶段之后的“调用操作”阶段中执行。