当处理一个已经用AJAX化的JSF 2.0组件时,是否应该永远不使用immediate="true"
?
举个例子:
如果我想在JSF 2.0页面上实现一个"取消"按钮,当用户点击"取消"时,不会运行任何验证,那么如果这是一个ajaxified组件,我应该在组件上设置immediate="true"
还是指定表单上没有任何组件被处理?如果需要,在不使用immediate="true"
的旧方式下,如何使用组件的AJAX功能实现这种功能?
当处理一个已经用AJAX化的JSF 2.0组件时,是否应该永远不使用immediate="true"
?
举个例子:
如果我想在JSF 2.0页面上实现一个"取消"按钮,当用户点击"取消"时,不会运行任何验证,那么如果这是一个ajaxified组件,我应该在组件上设置immediate="true"
还是指定表单上没有任何组件被处理?如果需要,在不使用immediate="true"
的旧方式下,如何使用组件的AJAX功能实现这种功能?
在取消按钮上使用immediate="true"
的目的已经变得无用,因为您可以使用<f:ajax>
,只需将其设置为execute="@this"
(这已经是默认值),以跳过同一表单中所有输入组件的处理。
当表单已经被提交但由于转换/验证失败而失败时,您可能会遇到问题。如果通过ajax点击取消按钮并在此之后呈现表单,则输入仍将标记为无效,并且模型值中的任何更改都不会反映出来(您可能正在做entity = new Entity();
或类似的事情以清除表单的旧值)。使用同步(非ajax)请求和immediate="true"
时不会出现此问题。实际上,这个问题与immediate="true"
无关,而与ajax请求的JSF生命周期有关。您基本上需要通过调用EditableValueHolder#resetValue()
来重置未包含在ajax execute
中但包含在ajax render
中的组件的无效状态。对于这个目的,OmniFaces提供了一个ResetInputAjaxActionListener
。