这是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获得相同的错误消息。
有关为何失败的任何想法?
谢谢!
答案 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。