【问题标题】:JSF immediate="true" for cancel button doesn't work取消按钮的 JSF immediate="true" 不起作用
【发布时间】:2011-10-10 02:36:47
【问题描述】:

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

现在,我单击记录#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;
    }

}

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>

【问题讨论】:

    标签: jsf-2


    【解决方案1】:

    immediate="true" 不能很好地处理同一视图上的 ajax 请求。归结为提交但未验证的值仍然存在于输入组件中。如果没有 ajax,后续表单提交的正常同步请求/响应将默默地“解决”这个问题。但是使用ajax,这不会发生。之前的ajax请求提交的值还在输入组件中。当UIInput#getSubmittedValue() 不返回null 时,将改为显示它,而与(更改的)模型值无关。

    基本上,当您想坚持使用 ajax 来获得取消按钮时,您需要排除输入被处理,而不是依赖 immediate="true"(这实际上是一种 hack) .在标准 JSF &lt;f:ajax&gt; 术语中,您可以使用按钮上的 execute="@this"(实际上是默认值)而不是 execute="@form" 来执行此操作。 PrimeFaces 按钮默认为@form,因此您需要更改:

    <p:commandButton value="Cancel"
        actionListener="#{formBean.cancelForm}"
        update="main" async="true" process="@this" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多