单击 p:commandButton 会导致 p:selectOneMenu 的值被设置两次
Clicking p:commandButton causes the value of p:selectOneMenu being set twice
我 运行 遇到 PrimeFaces 的问题 - 考虑将 SelectOneMenu
放在 Inplace
中的形式。在 Inplace 旁边我们有一个 CommandButton
用来重置 SelectOneMenu
.
的值
表单如下所示:
<h:form id="myform">
<p:inplace id="inplace" editor="true">
<p:ajax event="save" update="@(form)" />
<f:facet name="output">
<h:outputText value="#{testBean.year}" />
</f:facet>
<f:facet name="input">
<p:selectOneMenu id="selYears" value="#{testBean.year}">
<f:selectItem itemValue="2015" itemLabel="2015" />
<f:selectItem itemValue="2014" itemLabel="2014" />
<f:selectItem itemValue="2013" itemLabel="2013" />
</p:selectOneMenu>
</f:facet>
</p:inplace>
<p:commandButton id="btnResetYear" value="Reset year" rendered="#{testBean.year lt 2015}"
action="#{testBean.resetYear()}" update="@(form)" />
</h:form>
这是 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
- Select 不同的年份(例如 2013)
- 单击 "check" 按钮确认选择
但是,如果我尝试单击 "Reset year" 按钮,方法 setYear
将在调用 resetYear
之前以原始年份作为参数调用。这是我在控制台中看到的:
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
是为了例如从数据库加载数据,没有理由 运行 它的原始值,然后再次为新值。
如果我使用标准 CommandButton
而不是 PrimeFaces 提供的标准,它似乎可以正常工作:
<h:commandButton id="btnResetYear" value="Reset year" rendered="#{testBean.year lt 2015}">
<f:ajax listener="#{testBean.resetYear}" render="myform" />
</h:commandButton>
点击标准按钮会得到预期的结果:
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 的命令按钮设置为如上所述的行为,即不触发传入旧参数的 setYear
方法,或者我是否必须坚持使用 "standard" 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 CommandButton
的默认行为是处理页面上的所有内容,这与我设置 process="@all"
[ 基本相同=19=]
我通过 CommandButton
检查 request/response sent/received 的详细信息发现了这一点 - 请求 header 中有以下参数:
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
这是我的最终版本 CommandButton
:
<p:commandButton id="btnResetYear" value="Reset year" rendered="#{testBean.year lt 2015}"
action="#{testBean.resetYear()}" update="@(form)" process="@this" />
我希望通过在此处发布此解决方案来节省其他人的时间:-)
我 运行 遇到 PrimeFaces 的问题 - 考虑将 SelectOneMenu
放在 Inplace
中的形式。在 Inplace 旁边我们有一个 CommandButton
用来重置 SelectOneMenu
.
表单如下所示:
<h:form id="myform">
<p:inplace id="inplace" editor="true">
<p:ajax event="save" update="@(form)" />
<f:facet name="output">
<h:outputText value="#{testBean.year}" />
</f:facet>
<f:facet name="input">
<p:selectOneMenu id="selYears" value="#{testBean.year}">
<f:selectItem itemValue="2015" itemLabel="2015" />
<f:selectItem itemValue="2014" itemLabel="2014" />
<f:selectItem itemValue="2013" itemLabel="2013" />
</p:selectOneMenu>
</f:facet>
</p:inplace>
<p:commandButton id="btnResetYear" value="Reset year" rendered="#{testBean.year lt 2015}"
action="#{testBean.resetYear()}" update="@(form)" />
</h:form>
这是 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
- Select 不同的年份(例如 2013)
- 单击 "check" 按钮确认选择
但是,如果我尝试单击 "Reset year" 按钮,方法 setYear
将在调用 resetYear
之前以原始年份作为参数调用。这是我在控制台中看到的:
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
是为了例如从数据库加载数据,没有理由 运行 它的原始值,然后再次为新值。
如果我使用标准 CommandButton
而不是 PrimeFaces 提供的标准,它似乎可以正常工作:
<h:commandButton id="btnResetYear" value="Reset year" rendered="#{testBean.year lt 2015}">
<f:ajax listener="#{testBean.resetYear}" render="myform" />
</h:commandButton>
点击标准按钮会得到预期的结果:
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 的命令按钮设置为如上所述的行为,即不触发传入旧参数的 setYear
方法,或者我是否必须坚持使用 "standard" 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 CommandButton
的默认行为是处理页面上的所有内容,这与我设置 process="@all"
[ 基本相同=19=]
我通过 CommandButton
检查 request/response sent/received 的详细信息发现了这一点 - 请求 header 中有以下参数:
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
这是我的最终版本 CommandButton
:
<p:commandButton id="btnResetYear" value="Reset year" rendered="#{testBean.year lt 2015}"
action="#{testBean.resetYear()}" update="@(form)" process="@this" />
我希望通过在此处发布此解决方案来节省其他人的时间:-)