我有一个两个标签页,一个标签是记录列表,点击记录将切换到编辑标签,编辑标签中有保存和取消按钮。
现在,我点击记录#1,进行一些编辑,然后点击取消按钮。当然我不想验证表单,因为它被取消了,所以我在Cancel按钮上设置了immediate="true"
。现在关闭编辑选项卡,返回到记录列表。然后,我点击另一条记录#2,发生了问题:在编辑选项卡中,它仍然是记录#1的先前内容,而不是记录#2。我在调试视图中检查了变量,编辑表单的后端bean实际上填充了记录#2。
即,在立即命令后出现问题。
(在我添加验证和immediate =“true”之前,一切都很顺利。)
class FormBean {
Record activeRecord;
...
public void clickOnList() {
activeRecord = loadRecord(clickIndex);
}
public void cancelForm() {
activeRecord = null;
}
}
page.xhtml:
<h:form id="main">
...
<p:tab title="Edit" rendered="#{formBean.activeRecord != null}">
...
<p:commandButton value="Cancel"
actionListener="#{formBean.cancelForm}"
update="main" async="true" immediate="true" />
</p:tab>
</h:form>
答案 0 :(得分:18)
immediate="true"
与同一视图上的ajax请求不能很好地协同工作。归结为输入组件中仍然存在提交但未经验证的值。如果没有ajax,后续表单提交的正常同步请求/响应将默默“解决”这个问题。但是使用ajax,这不会发生。之前的ajax请求的提交值仍然存在于输入组件中。当UIInput#getSubmittedValue()
未返回null
时,无论(更改的)模型值如何,都会显示{{3}}。
基本上,当你想坚持使用取消按钮的ajax时,你需要排除输入被处理而不是依赖immediate="true"
(这实际上是一种破解)。在标准JSF <f:ajax>
术语中,您可以使用按钮上的execute="@this"
(实际上是默认设置)而不是execute="@form"
执行此操作。 PrimeFaces按钮默认为@form
,因此您需要更改此项:
<p:commandButton value="Cancel"
actionListener="#{formBean.cancelForm}"
update="main" async="true" process="@this" />