为什么将"立即"属性添加到EditableValueHolders?

Gee*_*eek 5 jsf design-decisions immediate-attribute

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

Bal*_*usC 15

它用于以EditableValueHolder相同的形式对几个组件的验证进行优先级排序.

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

当与immediate="true"相同形式的命令按钮结合使用时,这将导致完全跳过所有非立即输入.一个好的现实世界的例子是一个登录表单,其中包含2个字段"username"和"password",required="true"以及2个按钮:"login"和"password forgotten".您可以immediate="true"输入"用户名"字段和"忘记密码"按钮以跳过required="true"对密码字段的检查.

在黑暗的JSF 1.x年代,immediate="true"通常(ab)经常被(ab)用作组合的黑客,valueChangeListener并且FacesContext#renderResponse()通常在级联下拉列表中.长话短说,这是一篇关于此的老博客文章.到目前为止,它使开发人员能够在更改a时执行辅助bean方法,<h:selectOneMenu>而不会验证同一表单中的所有其他输入.但是现在,由于ajax很棒,这种黑客行为是不必要的.您可以在我们的<h:selectOneMenu>维基页面底部找到此案例的concretre示例.

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

也可以看看: