Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 JSF immediate=";“真的”;对于“取消”按钮不存在';行不通_Jsf 2 - Fatal编程技术网

Jsf 2 JSF immediate=";“真的”;对于“取消”按钮不存在';行不通

Jsf 2 JSF immediate=";“真的”;对于“取消”按钮不存在';行不通,jsf-2,Jsf 2,我有一个两个选项卡的页面,一个选项卡是记录列表,点击记录将切换到编辑选项卡,编辑选项卡中有保存和取消按钮 现在,我单击记录#1,进行一些编辑,然后单击取消按钮。当然,我不想验证表单,因为它已被取消,所以我在“取消”按钮上设置了immediate=“true”。现在“编辑”选项卡关闭,返回记录列表。然后,我点击另一条记录#2,问题出现了:在编辑选项卡中,它仍然是记录#1之前的内容,而不是记录#2。我已经检查了debug视图中的变量,编辑表单的backbean实际上填充了记录#2 也就是说,在一个直

我有一个两个选项卡的页面,一个选项卡是记录列表,点击记录将切换到编辑选项卡,编辑选项卡中有保存和取消按钮

现在,我单击记录#1,进行一些编辑,然后单击取消按钮。当然,我不想验证表单,因为它已被取消,所以我在“取消”按钮上设置了
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" />