jsf - selectOneMenu上的valueChangeListener和Ajax执行顺序问题

标签 jsf jsf-2

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

基本上我想发生的是:

  • 我更改选择菜单
  • 使用Ajax提交新值以更新myBean(使用f:ajax)
  • 基于新提交的值执行查询(使用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/

    相关文章:

    java - 当表单被 JavaScript 禁用时,JSF 表单不会被提交

    jsf - 在 ManagedProperty 中使用 ResourceBundle 中的属性

    jsf-2 - @Produces 为JSF2 和JAX-RS 中的当前用户对象?

    AJAX 渲染属性不适用于渲染的 ="false"组件

    javascript - 我们如何将javascript变量设置为jsf参数

    JSF 实现和组件库

    java - 在 webapp 中显示控制台输出

    css - JSF CSS 优先顺序

    jsf - Facelets 重复标签索引

    jsf-2 - 在托管 Bean 中使用 Bean