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
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" />
我希望通过在此处发布此解决方案来节省其他人的时间:-)相关: