Jsf 单击p:commandButton可使p:selectOneMenu的值设置两次 我遇到了一个带有PrimeFACTS的问题——考虑格式 SelectOneMenu 被放置在位置> />代码>中。在Inplace旁边,我们有一个命令按钮,用于重置选择菜单的值

Jsf 单击p:commandButton可使p:selectOneMenu的值设置两次 我遇到了一个带有PrimeFACTS的问题——考虑格式 SelectOneMenu 被放置在位置> />代码>中。在Inplace旁边,我们有一个命令按钮,用于重置选择菜单的值,jsf,primefaces,selectonemenu,commandbutton,Jsf,Primefaces,Selectonemenu,Commandbutton,表单如下所示: 这是TestBean: import javax.annotation.PostConstruct; import javax.faces.bean.ManagedBean; import javax.faces.bean.ViewScoped; @ManagedBean @ViewScoped public class TestBean { private int year; @PostConstruct private void init()

表单如下所示:


这是TestBean:

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class TestBean {
    private int year;

    @PostConstruct
    private void init() {
        this.year = 2015;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        System.out.println("---> setYear: " + year);
        this.year = year;
        this.someMethod();
    }

    public void someMethod() {
        System.out.println("---> someMethod: " + this.year);
    }

    public void resetYear() {
        System.out.println("---> resetYear");
        this.setYear(2015);
    }
}
下面的场景效果很好:

  • 单击年份以显示实际的
    SelectOneMenu
  • 选择不同的年份(如2013年)
  • 单击“检查”按钮确认选择
  • 但是,如果我尝试单击“重置年份”按钮,则会在调用
    resetYear
    之前调用方法
    setYear
    ,并将原始年份作为参数。这是我在控制台中看到的:

    12:28:40,003 INFO  [stdout] (default task-15) ---> setYear: 2013
    12:28:40,003 INFO  [stdout] (default task-15) ---> someMethod: 2013
    12:28:40,004 INFO  [stdout] (default task-15) ---> resetYear
    12:28:40,004 INFO  [stdout] (default task-15) ---> setYear: 2015
    12:28:40,004 INFO  [stdout] (default task-15) ---> someMethod: 2015
    
    这正是我不想要的,因为
    someMethod
    的目的是从DB加载数据,没有理由对原始值再对新值运行它

    如果我使用标准的
    命令按钮
    而不是PrimeFaces提供的按钮,它似乎可以正常工作:

    
    
    单击标准按钮将给出预期结果:

    12:42:11,506 INFO  [stdout] (default task-88) ---> resetYear
    12:42:11,506 INFO  [stdout] (default task-88) ---> setYear: 2015
    12:42:11,506 INFO  [stdout] (default task-88) ---> someMethod: 2015
    
    问题:

    这是PrimeFaces中的错误还是我做错了什么?是否有办法设置PF的CommandButton,使其行为与上述相同,即不使用传入的旧参数触发
    setYear
    方法,还是必须使用“标准”
    CommandButton

    我尝试将
    immediate=“true”
    设置为
    CommandButton
    ,它确实跳过了先设置原始值,但是
    SelectOneMenu
    没有考虑新值,无论我在按钮的
    update
    属性中添加了什么,它仍然显示原始值

    该示例使用以下命令运行:

    • Java 1.8(jdk1.8.0_51-64位)
    • PrimeFaces 5.2
    • WildFly 8.2.0(也使用JBoss 7.1进行了测试)

    任何想法都是非常受欢迎的。

    再过几个小时,我发现了问题所在-PF的
    命令按钮的默认行为是处理页面上的所有内容,这与我设置
    process=“@all”
    基本相同

    我通过检查
    CommandButton
    发送/接收的请求/响应的详细信息发现了这一点-请求头中有以下参数:

    javax.faces.partial.execute = @all
    
    因此,将
    process=“@this”
    设置为
    CommandButton
    成功,我现在可以观察到正确的行为:

    18:45:51,874 INFO  [stdout] (default task-41) ---> resetYear
    18:45:51,874 INFO  [stdout] (default task-41) ---> setYear: 2015
    18:45:51,874 INFO  [stdout] (default task-41) ---> someMethod: 2015
    
    这是我的
    命令按钮的最终版本:

    <p:commandButton id="btnResetYear" value="Reset year" rendered="#{testBean.year lt 2015}"
        action="#{testBean.resetYear()}" update="@(form)" process="@this" />
    
    
    
    我希望通过在此处发布此解决方案来节省其他人的时间:-)

    相关: