【问题标题】:Conditionally render components with ajax conditionally only if validation passes仅当验证通过时,使用 ajax 有条件地渲染组件
【发布时间】:2015-08-13 10:36:36
【问题描述】:

我正在使用 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 内的组件中,如果验证失败,我不想呈现该部分,以便它可以保持当前的视觉状态.

【问题讨论】:

    标签: validation jsf jsf-2.2 conditional-rendering


    【解决方案1】:

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

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

    例如

    <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" 以使其成为 &lt;div&gt; 组件而不是 &lt;span&gt; 组件,具体取决于最终标记。

    另见:

    【讨论】:

    • 感谢您的回答 BalusC。我应该更清楚地解释我到底想做什么。我已经编辑了我的问题以澄清它。
    • 我在“另见”链接后面添加了一些更合乎逻辑的解释和答案。至于编辑过的问题,我进一步改进了编辑。将来,请不要以使答案完全无效的方式更改问题(在您的特定情况下,我似乎只回答了您早就知道的答案,这对于未来的读者来说看起来真的很混乱和愚蠢)。如果你真的需要,你最好问一个新问题,否则回答者可能会完全删除答案并否决问题。
    猜你喜欢
    • 2015-12-03
    • 2016-02-20
    • 2018-09-13
    • 2019-02-18
    • 1970-01-01
    • 2018-09-14
    • 2013-04-03
    • 2018-12-20
    • 1970-01-01
    相关资源
    最近更新 更多