selectOneMenu上的valueChangeListener和ajax执行顺序问题

ber*_*tie 5 jsf jsf-2

我目前正在经历一种奇怪的现象,其中在执行valueChangeListener之前将值设置为模型.

基本上我想要发生的是:

  1. 我改变了选择菜单
  2. 使用Ajax提交新值以更新myBean(使用f:ajax)
  3. 基于新提交的值执行查询(使用valueChangeListener)
  4. 根据上一个查询的结果渲染表

但是当我运行它时会发生什么,顺序是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>
Run Code Online (Sandbox Code Playgroud)

这是豆子的摘录:

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;
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

searching with this.budget == xxxx
setting budget : yyyy
Run Code Online (Sandbox Code Playgroud)

我想要的是,首先从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>
Run Code Online (Sandbox Code Playgroud)

我不知道我做错了什么?

谢谢 !

Bal*_*usC 15

valueChangeListener在验证阶段执行,之前的更新模型值阶段.据intented能够得到的手柄新旧值,以便在必要时可以根据该做点生意的东西(日志?)真正的变化.在JSF 1.x中,这是比不过常(AB)用于调用只有一个下拉变化的行动更多,但它以组合形式使用onchange="submit()",immediate="true",FacesContext#renderResponse()和其他东西.选择的值将通过ValueChangeEvent#getNewValue()(ValueChangeEvent应该被定义为方法的参数)来获得.

对于JSF 2.x valueChangeListener,在这种情况下你不再需要了.无论如何,你对旧的价值也不感兴趣.使用相反的listener属性<f:ajax>.

<f:ajax listener="#{bean.actionSearch}" />
Run Code Online (Sandbox Code Playgroud)

这将在" 更新模型值"阶段之后的"调用操作"阶段执行.