我目前遇到一种奇怪的现象,即在执行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>
这是摘自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
了。无论如何,您也不会对旧值感兴趣。请改用 listener
的<f:ajax>
属性。
<f:ajax listener="#{bean.actionSearch}" />
这将在“更新模型值”阶段之后的“调用操作”阶段中执行。
关于jsf - selectOneMenu上的valueChangeListener和Ajax执行顺序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5698371/