【问题标题】:valueChangeListener and ajax execution order problem on selectOneMenuselectOneMenu上的valueChangeListener和ajax执行顺序问题
【发布时间】:2011-04-18 03:57:33
【问题描述】:

我目前遇到一个奇怪的现象,即在执行 valueChangeListener 之前为模型设置值。

基本上我想要发生的是:

  1. 我更改了选择菜单
  2. 使用 Ajax 提交新值以更新 myBean(使用 f:ajax)
  3. 根据新提交的值执行查询(使用 valueChangeListener)
  4. 根据上次查询的结果呈现表

但是当我按照这个顺序运行它时会发生什么,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

我想要的是,首先从 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>

我想知道我做错了什么?

谢谢!

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    valueChangeListener 在验证阶段执行,在更新模型值阶段之前。它旨在能够获得 旧值和新值的句柄,以便您可以在必要时根据 real 更改做一些业务工作(记录?) .然而,在 JSF 1.x 中,这通常(ab)用于仅在下拉更改上调用操作,但它必须与 onchange="submit()"、immediate="true"、FacesContext#renderResponse() 和其他东西结合使用。选择的值由ValueChangeEvent#getNewValue() 获取(ValueChangeEvent 应该定义为方法的参数)。

    对于 JSF 2.x,在这种情况下您不再需要 valueChangeListener。无论如何,您也不会对旧值感兴趣。请改用&lt;f:ajax&gt; 的listener 属性。

    <f:ajax listener="#{bean.actionSearch}" />
    

    这将在 Invoke Action 阶段执行,在更新模型值阶段之后。

    【讨论】:

    • 啊!现在我对这个话题有了更多的了解。我对这个案例感到惊讶,因为以前有另一个类似的案例可以使用 valueChangeListener。现在我注意到在有效的方法中,我有 ValueChangeEvent 方法,并且从事件对象中,我获取新值并手动更新模型。我在ajax上尝试了监听器解决方案。一如既往的感谢!
    • 如果您出于任何原因对旧值感兴趣怎么办?这似乎是丢失的功能:(
    猜你喜欢
    • 2014-02-19
    • 2011-09-20
    • 2023-03-16
    • 2014-11-13
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多