试图在ui外面渲染一个h:panelGroup:重复复杂的结构

时间:2013-07-28 10:38:25

标签: jsf jsf-2

这是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被重新渲染。

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

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

有关为何失败的任何想法?

谢谢!

1 个答案:

答案 0 :(得分: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。

另见: