在处理 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) 支持