6

最初immediate标志仅用于ActionSource接口。但后来它也被添加到EditableValueHolder界面中。设计决策的原因是什么?

4

1 回答 1

15

它用于对EditableValueHolder同一表单中的多个组件进行优先级验证。

想象一个包含输入组件和immediate="true"没有这个属性的输入组件的表单。即时输入将在应用请求值阶段(比平时早一个阶段)进行验证。非即时输入将在验证阶段(通常阶段)进行验证。如果至少有一个立即输入的验证失败,则非立即输入将根本不会被转换/验证,因此不会生成任何转换/验证错误消息。这在具有复杂验证规则的表单中特别有用,当对(立即)组件 X 的验证无论如何都失败时验证组件 Y 是没有意义的。

当与相同形式的命令按钮结合使用immediate="true"时,这将导致所有非立即输入被完全跳过。一个很好的真实示例是一个登录表单,其中包含 2 个字段“用户名”和“密码”required="true"以及 2 个按钮:“登录”和“忘记密码”。您可以immediate="true"点击“用户名”字段和“忘记密码”按钮来跳过required="true"对密码字段的检查。

在黑暗的 JSF 1.x 时代, theimmediate="true"也经常(ab)用作与valueChangeListenerand组合的黑客,FacesContext#renderResponse()在级联下拉列表中更常见。长话短说,这是一篇关于此的旧博客文章。至此,它使开发人员能够在更改 a 时执行支持 bean 方法,<h:selectOneMenu>而无需验证相同表单中的所有其他输入。但是这些天来,由于 ajax 非常棒,这种 hack 是不必要的。您可以在我们的<h:selectOneMenu>wiki 页面底部找到该案例的具体示例。

这些天来,immediate="true"仍然经常(ab)使用,以便有一个完全绕过所有其他输入的特定按钮,例如“上帝形式”反模式中的注销按钮(所有东西都被放在一个巨大的 中<h:form>),或错误提交表单的取消按钮。当您开始immediate="true"在其中一个输入上实际需要正确的方式时,这样的按钮会损坏。您最好以自己的形式放置这样的注销按钮,或者将其更改为仅处理自身(process="@this"在 PrimeFaces 中)。而且你最好把这样的取消按钮改成只同步刷新页面<h:button value="Cancel" />。如果表单绑定到请求/视图范围的 bean 并且在动态页面上禁用了浏览器缓存,则此方法可以正常工作。

也可以看看:

于 2012-10-25T15:36:52.360 回答