Ajax 更新/渲染在具有 render 属性的组件上不起作用

Ajax update/render does not work on a component which has rendered attribute

提问人:Artem Moskalev 提问时间:2/10/2013 最后编辑:BalusCArtem Moskalev 更新时间:7/13/2016 访问量:59562

问:

我正在尝试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 呈现属性 条件渲染 ajax-update

评论


答:

108赞 BalusC 2/10/2013 #1

如果组件本身首先没有渲染,则无法通过 ajax 重新渲染(更新)组件。必须始终渲染组件,然后 ajax 才能重新渲染它。Ajax 正在使用 JavaScript 来查找需要更新的组件。但是,如果 JSF 没有首先渲染组件,那么 JavaScript 就找不到任何要更新的内容。document.getElementById()

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

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

另请参阅:

评论

0赞 perissf 2/10/2013
bean 不应该至少是 ViewScoped 还是更好的 SessionScoped?
0赞 Artem Moskalev 2/10/2013
但容器不会打印任何异常跟踪。通常,当未找到 id 时 - 它会打印在作用域中找不到此类 id。
1赞 BalusC 2/10/2013
好吧,那么登录名只是无效:)
0赞 Artem Moskalev 2/10/2013
这将是一个完美的解释:)但是持久性提供程序找到了它 - 我检查了代码)
1赞 BalusC 7/24/2017
@TREMOR:冒号是当前形式的代码的正确解决方案。您显然有一个不同的构造,其中所有内容都放置在同一个命名容器组件中。查看最后一个“另请参阅”链接,了解如何确定正确的客户端 ID。