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

时间:2012-10-25 15:02:44

标签: jsf design-decisions immediate-attribute

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

1 个答案:

答案 0 :(得分: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)被用作与valueChangeListenerFacesContext#renderResponse()组合的黑客攻击,通常在级联下拉列表中。长话短说,这是一个old blog article。到目前为止,它使开发人员能够在更改<h:selectOneMenu>时执行支持bean方法,而不会验证同一表单中的所有其他输入。但是现在,由于ajax很棒,这种黑客行为是不必要的。您可以在our <h:selectOneMenu> wiki page的底部找到此案例的concretre示例。

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

另见: