我目前遇到一种奇怪的现象,在执行valueChangeListener之前,将值设置为模型。
基本上我想要发生的是:
但是当我按照这个顺序运行时会发生什么,1 - 3 - 2 - 4(不是我认为的1 - 2 - 3 - 4)
这是UI的一部分:
<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>
这是豆子的摘录:
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
我想要的是,首先从UI中选择的新值设置预算,然后根据新UI开始搜索。但我不知道如何实现这一点。
我正在使用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>
我不知道我做错了什么?
谢谢!
答案 0 :(得分:15)
valueChangeListener
在验证阶段执行,在更新模型值阶段之前执行。它的目的是能够获得两者旧值和新值的处理,以便您可以根据真实更改在必要时执行一些业务(日志记录?) 。但是,在JSF 1.x中,这通常(ab)用于仅对下拉列表更改调用操作,但它必须与onchange="submit()"
,immediate="true"
,FacesContext#renderResponse()
结合使用和其他东西。所选值将由ValueChangeEvent#getNewValue()
获得(ValueChangeEvent
应该被定义为方法的参数)。
对于JSF 2.x,在这种情况下你不再需要valueChangeListener
。无论如何,你对旧的价值也不感兴趣。请改用<f:ajax>
的listener
属性。
<f:ajax listener="#{bean.actionSearch}" />
这将在Invoke Action阶段执行,在更新模型值阶段后执行。