只有在验证通过时才有条件地渲染 ajax 的组件

Conditionally render components with ajax conditionally only if validation passes

我正在使用 JSF 2.2,我想知道是否有一种方法可以仅在验证通过时使用 ajax 有条件地呈现组件。通过使用 ajax 的 render 属性,无论是否通过验证,组件都将被渲染。 我所追求的是:

<f:ajax ... render="#{validationHasPassed ? 'foo' : ''}" />
...
<h:panelGroup id="foo">
          <!-- other components here -->
  </h:panelGroup>

是否可以像这样以类似的方式有条件地渲染组件? 在我的例子中,我不想在片段中使用渲染属性并将其设置为 true 或 false,因为如果验证失败,这会使片段在 DOM 中根本不存在。我可能有特定的 css 样式,例如在与页面进行一些交互后通过 jQuery 获取的 panelGroup 中的组件,如果验证失败,我不想呈现该部分,所以它可以保持在当前的视觉状态。

你可以利用FacesContext#isValidationFailed()。如果在当前的 JSF 生命周期中验证失败,它将 return trueFacesContext 的当前实例在 EL 中也可用 #{facesContext}.

只需在 rendered 属性中检查它并更新其父占位符组件。请注意,您不能有条件地渲染一个组件,该组件本身的 rendered 属性设置为 JavaScript 否则将无法找到和更新它。你理论上的 <f:ajax> 尝试也会以同样的方式失败。

例如

<f:ajax ... render="foo-holder" />
...
<h:panelGroup id="foo-holder">
    <h:panelGroup id="foo" rendered="#{not facesContext.validationFailed}">
        Validation has not failed.
    </h:panelGroup>
</h:panelGroup>

如有必要,添加 layout="block" 以使它们成为 <div> 组件而不是 <span> 组件,具体取决于最终标记。

另请参阅:

  • Why do I need to nest a component with rendered="#{some}" in another component when I want to ajax-update it?