1

这是jsf页面的一般结构:

<ui:repeat id="repeater" varStatus="stat" >
  <h:form id="the-form">
    <h:panelGroup id="renderme">
      <ui:repeat id="inner-repeater">
         <h:commandButton>
           <f:ajax render=":repeater:#{stat.index}:the-form:renderme">
         </h:commandButton>
      </ui:repeat>
    </h:panelGroup>
  </h:form>
</ui:repeat>

所以..这里的按钮,当点击时,应该会导致元素renderme被重新渲染。

在实践中,虽然当我查看 html 页面时,生成的 id 是正确的,但我得到“带有 id ... 的组件”。

此外,我尝试使用#{component.parent.parent.clientId}产生相同 id 并且仍然从 JSF 得到相同的错误消息。

知道为什么这会失败吗?

谢谢!

4

1 回答 1

2

原因很简单,这不起作用,因为viewRoot.findComponent("repeater:0:the-form:renderme")按要求<f:ajax render>不返回任何内容。这样的组件在组件树中不存在。此 ID 仅存在于生成的 HTML 输出中。相反,它viewRoot.findComponent("repeater:the-form:renderme")会返回一些东西,但这又不存在于 HTML DOM 树中,其中 JavaScript 需要基于 ajax 响应进行更新。即使那样,这也不是您所需要的。

这就是 JSTL 可以拯救的地方。它能够动态地构建 JSF 组件树并动态地为循环中生成的组件分配 ID:

<c:forEach ... varStatus="stat">
  <h:form id="the-form_#{stat.index}">
    <h:panelGroup id="renderme">
      <ui:repeat id="inner-repeater" ...>
         <h:commandButton ...>
           <f:ajax render=":the-form_#{stat.index}:renderme">
         </h:commandButton>
      </ui:repeat>
    </h:panelGroup>
  </h:form>
</c:forEach>

这只会在您将<c:forEach>值绑定到视图范围的 bean 并且使用早于 2.1.18 的 Mojarra 版本时导致问题。你需要至少升级到 Mojarra 2.1.18。

也可以看看:

于 2013-07-28T14:39:36.830 回答