如果immediate="true"有一个支持Ajax JSF 2.0组件打交道时从来没有被使用?
immediate="true"
该示例可能是:
如果我想在JSF 2.0页面上实现一个“取消”按钮,如果用户单击“取消”,则不应运行任何验证,immediate="true"如果该组件是一个邻接组件,则应在该组件上进行设置,或者应指定该表单上没有任何组件被处理?如果是这样,使用组件的AJAXified功能而不是使用“旧方法”来实现此功能的方法是immediate="true"什么?
实际上,在immediate="true"取消按钮上使用的目的已变得毫无用处,因为<f:ajax>您可以将execute="@this"其设置为(已经是默认设置)以跳过对同一形式的所有输入组件的处理。
<f:ajax>
execute="@this"
仅当表单已经预先提交但由于转换/验证失败而失败时,您才可能遇到问题。如果您通过ajax按下“取消”按钮并在此后呈现表单,则输入仍将被标记为无效,并且模型值的任何更改都不会反映出来(您可能正在使用“ entity = new Entity();取消操作”方法或执行某种操作以清除旧值)的形式)。与一起使用同步(非ajax)请求时,不会发生此问题immediate="true"。这个问题实际上与无关immediate="true",而是与ajax请求的JSF生命周期有关。基本上,您需要通过调用EditableValueHolder#resetValue()未包含在ajax execute中但包含在ajax中的组件来重置所涉及的输入组件的无效状态render。OmniFaces有ResetInputAjaxActionListener出于这样的目的。
entity = new Entity();
EditableValueHolder#resetValue()
execute
render
ResetInputAjaxActionListener