在处理 AJAXified JSF 2.0 组件时,是不是应该永远不使用 immediate="true" ?

Posted

技术标签:

【中文标题】在处理 AJAXified JSF 2.0 组件时,是不是应该永远不使用 immediate="true" ?【英文标题】:Should immediate="true" never be used when dealing with an AJAXified JSF 2.0 component?在处理 AJAXified JSF 2.0 组件时,是否应该永远不使用 immediate="true" ? 【发布时间】:2012-05-17 03:44:30 【问题描述】:

在处理 AJAX 化的 JSF 2.0 组件时,是否应该永远不要使用 immediate="true"

示例可能是:

如果我想在 JSF 2.0 页面上实现一个“取消”按钮,如果用户点击“取消”,则不应该运行任何验证,如果它是一个 ajaxified 组件,我应该在组件上设置 immediate="true" 还是应该指定不应该处理表单上的组件?如果是这样,使用组件的 AJAXified 功能实现此功能的方法是什么,而不是使用 immediate="true" 的“旧方式”?

【问题讨论】:

【参考方案1】:

确实,在取消按钮上使用immediate="true" 的目的已经变得毫无用处,因为<f:ajax> 您可以将其设置为execute="@this"(这已经是默认设置)以跳过对同一输入组件的处理表格。

您可能只会在表单已经预先提交但由于转换/验证失败而失败时遇到问题。如果您通过 ajax 点击取消按钮并在之后呈现表单,输入仍将被标记为无效,并且模型值的任何更改都不会反映(您可能正在执行 entity = new Entity(); 或取消操作方法中的某些内容来清除表单的旧值)。使用带有immediate="true" 的同步(非ajax)请求时不会发生此问题。这个问题实际上与immediate="true"无关,而是与ajax请求的JSF生命周期有关。您基本上需要通过在ajax execute 中未包含但在ajax render 中包含的组件上调用EditableValueHolder#resetValue() 来重置相关输入组件的无效状态。 OmniFaces 有一个 ResetInputAjaxActionListener 就是为了这个目的。

【讨论】:

以上是关于在处理 AJAXified JSF 2.0 组件时,是不是应该永远不使用 immediate="true" ?的主要内容,如果未能解决你的问题,请参考以下文章

向 JSF 2.0 UIInput 组件添加自定义属性 (HTML5) 支持

关于 JSF 2.0 自定义组件和 Primefaces 的帮助

JSF 2.0 动态删除组件

在哪里放置组合组件?(JSF 2.0)

jsf 2.0 自定义组件/标签不复合

在 PrimeFaces 3.4 JSF 2.0 中按 id 查找组件