Ajax 更新/渲染不适用于具有渲染属性的组件

Posted

技术标签:

【中文标题】Ajax 更新/渲染不适用于具有渲染属性的组件【英文标题】:Ajax update/render does not work on a component which has rendered attribute 【发布时间】: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 实际上是可用的。这是如何引起的,我该如何解决?

【问题讨论】:

【参考方案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>

另见:

Why do I need to nest a component with rendered="#some" in another component when I want to ajax-update it? How to find out client ID of component for ajax update/render? Cannot find component with expression "foo" referenced from "bar"

【讨论】:

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

以上是关于Ajax 更新/渲染不适用于具有渲染属性的组件的主要内容,如果未能解决你的问题,请参考以下文章

当浏览器样式与 nextjs 中带有情感样式组件的服务器不同时,样式不适用于第一个客户端渲染(也不是之后)

Reactstrap 不适用于 Razzle 服务器端渲染

具有渲染属性的jsf组件验证失败

在 Apollo-client 中,writeQuery 会更新缓存,但 UI 组件不会重新渲染

禁用属性不适用于 ListBoxFor 和 DropDownListFor

Datatables Ajax 无法渲染 Vue 组件