gpt4 book ai didi

jsf-2 - JSF 立即 ="true"取消按钮不起作用

转载 作者:行者123 更新时间:2023-12-04 16:29:52 30 4
gpt4 key购买 nike

我有一个两个标签页,一个标签是记录列表,点击记录会切换到编辑标签,编辑标签中有保存和取消按钮。

现在,我单击记录 #1,进行一些编辑,然后单击取消按钮。当然我不想验证表单,因为它被取消了,所以我设置了 immediate="true"在取消按钮上。现在编辑选项卡关闭,回到记录列表。然后,我单击另一条记录#2,出现问题:在编辑选项卡中,它仍然是记录#1 的先前内容,而不是记录#2。我在调试 View 中检查了变量,编辑表单的后台 bean 实际填充了记录 #2。

即,在立即命令后损坏的东西。

(在我添加验证和立即=“真”之前,一切都很好。)

class FormBean {

Record activeRecord;
...

public void clickOnList() {
activeRecord = loadRecord(clickIndex);
}

public void cancelForm() {
activeRecord = null;
}

}

页面.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"不能很好地处理同一 View 上的 ajax 请求。归结为提交但未验证的值仍然存在于输入组件中。如果没有 ajax,后续表单提交的正常同步请求/响应将默默地“解决”这个问题。但是对于 ajax,这不会发生。之前的ajax 请求提交的值仍然存在于输入组件中。当 UIInput#getSubmittedValue() 不返回 null ,它将改为显示,无论(更改的)模型值如何。

基本上,当你想坚持使用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" />

关于jsf-2 - JSF 立即 ="true"取消按钮不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7708041/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com