取消按钮的JSF immediate ="true"不起作用

Xiè*_*léi 5 jsf-2

我有一个两个标签页,一个标签是记录列表,单击记录将切换到编辑选项卡,并在编辑选项卡中有保存和取消按钮.

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

也就是说,在立即命令之后就会出现问题.

(在我添加验证和immediate ="true"之前,一切都很顺利.)

class FormBean {

    Record activeRecord;
    ...

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

    public void cancelForm() {
        activeRecord = null;
    }

}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 18

对于immediate="true"同一视图上的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" />
Run Code Online (Sandbox Code Playgroud)