Jsf 2 JSF immediate=";“真的”;对于“取消”按钮不存在';行不通
我有一个两个选项卡的页面,一个选项卡是记录列表,点击记录将切换到编辑选项卡,编辑选项卡中有保存和取消按钮 现在,我单击记录#1,进行一些编辑,然后单击取消按钮。当然,我不想验证表单,因为它已被取消,所以我在“取消”按钮上设置了Jsf 2 JSF immediate=";“真的”;对于“取消”按钮不存在';行不通,jsf-2,Jsf 2,我有一个两个选项卡的页面,一个选项卡是记录列表,点击记录将切换到编辑选项卡,编辑选项卡中有保存和取消按钮 现在,我单击记录#1,进行一些编辑,然后单击取消按钮。当然,我不想验证表单,因为它已被取消,所以我在“取消”按钮上设置了immediate=“true”。现在“编辑”选项卡关闭,返回记录列表。然后,我点击另一条记录#2,问题出现了:在编辑选项卡中,它仍然是记录#1之前的内容,而不是记录#2。我已经检查了debug视图中的变量,编辑表单的backbean实际上填充了记录#2 也就是说,在一个直
immediate=“true”
。现在“编辑”选项卡关闭,返回记录列表。然后,我点击另一条记录#2,问题出现了:在编辑选项卡中,它仍然是记录#1之前的内容,而不是记录#2。我已经检查了debug视图中的变量,编辑表单的backbean实际上填充了记录#2
也就是说,在一个直接的命令之后,某个东西坏了
(在我添加验证和immediate=“true”之前,一切都很顺利。)
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>
...
...
immediate=“true”不能很好地处理同一视图上的ajax请求。归根结底,提交但未验证的值仍然存在于输入组件中。如果没有ajax,后续表单提交的正常同步请求/响应将默默地“解决”这个问题。但在ajax中,这种情况不会发生。上一个ajax请求提交的值仍然存在于输入组件中。当不返回null
时,无论(更改的)型号值如何,它都将显示
基本上,当您想坚持使用ajax执行取消按钮时,您需要排除正在处理的输入,而不是依赖immediate=“true”
(这实际上是一种黑客行为)。在标准的JSF
术语中,您可以使用按钮上的execute=“@this”
(这实际上是默认值)而不是execute=“@form”
。PrimeFaces按钮默认为@form
,因此您需要更改:
<p:commandButton value="Cancel"
actionListener="#{formBean.cancelForm}"
update="main" async="true" process="@this" />
<p:commandButton value="Cancel"
actionListener="#{formBean.cancelForm}"
update="main" async="true" process="@this" />