【问题标题】:Ajax update/render does not work on a component which has rendered attributeAjax 更新/渲染不适用于具有渲染属性的组件
【发布时间】:2021-09-04 23:12:37
【问题描述】:

我正在尝试对有条件渲染的组件进行 ajax 更新。

<h:form>
    ...
    <h:commandButton value="Login" action="#{login.submit}">
        <f:ajax execute="@form" render=":text" />
    </h:commandButton>
</h:form>
<h:outputText id="text" value="You're logged in!" rendered="#{not empty user}" />

但是,这不起作用。我可以保证#{user} 实际上是可用的。这是如何引起的,我该如何解决?

【问题讨论】:

    标签: jsf jsf-2 rendered-attribute conditional-rendering ajax-update


    【解决方案1】:

    如果组件本身未首先呈现,则无法通过 ajax 重新呈现(更新)组件。必须始终在 ajax 重新渲染之前渲染组件。 Ajax 正在使用 JavaScript document.getElementById() 来查找需要更新的组件。但是如果 JSF 没有首先渲染组件,那么 JavaScript 就找不到要更新的东西了。

    解决方案是简单地引用始终呈现的父组件。

    <h:form>
        ...
        <h:commandButton ...>
            <f:ajax ... render=":text" />
        </h:commandButton>
    </h:form>
    <h:panelGroup id="text">
        <h:outputText ... rendered="#{not empty user}" />
    </h:panelGroup>
    

    另见:

    【讨论】:

    • 不应该 bean 至少是 ViewScoped,还是更好的 SessionScoped?
    • 但是容器没有打印任何异常跟踪。通常当找不到 id 时 - 它会打印出在范围内找不到这样的 id。
    • 好吧,那么登录就是无效的:)
    • 这将是一个完美的解释 :) 但是持久性提供者找到了它 - 我检查了代码)
    • @TREMOR:冒号是当前形式的代码的正确解决方案。你显然有一个不同的结构,所有东西都放在同一个命名容器组件中。检查最后一个“另见”链接,了解如何确定正确的客户端 ID。
    猜你喜欢
    • 2012-11-26
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    相关资源
    最近更新 更多