<ui:repeat id="outerlist"> <my:compositeComponent id="myCC"> <h:panelgroup id="container"> Some content here (outputText,etc.) <ui:repeat id="innerlist"> <h:commandButton> <f:ajax render=":#{cc.clientId}:container" /> <!-- all closing tags accordingly -->
由于容器内的内容取决于内部列表按钮的操作,我需要更新它.当没有外部ui:重复时,如上所示的方法起作用.但是,如果存在组件未找到错误,则会失败.
这似乎是因为cc.clientId本身包含外部ui:repeat的行索引,例如,outerlist:0:myCC:容器.如a comment to this answer所示,该索引ID在视图树的服务器端表示中不可用.而是“行索引仅存在于客户端”.我必须承认,我不太明白这个索引是如何完成的以及服务器端的可用内容.
所以我的问题是:JSF如何进行这种索引,它(在服务器上)如何将ui内部的不同“实例”分开:重复,是否有解决方案,我想用上面的代码实现什么?
facesContext.getViewRoot().findComponent(clientId);
(因此可以找到它以便为ajax响应呈现其新的HTML表示)
并在JavaScript的客户端
document.getElementById(clientId);
(一旦新的HTML内容的ajax响应到达,它就可以被JS更新/替换)
作为< ui:repeat>仅在视图呈现时间内运行,具有行索引的客户机ID不代表服务器端的有效组件(来自findComponent()的“无法找到组件…”错误),但它确实表示客户端中的有效HTML元素侧.基本上,您需要客户端ID,而不需要服务器端的行索引和客户端的行索引.但这不适用于< ui:repeat>因为它(不幸的是)不可能通过单独的findComponent()来选择特定迭代轮次的组件树状态.
使用JSTL< c:forEach>时它应该可以正常工作并且在视图构建期间运行时动态分配组件ID,并且实际上在视图树中生成多个值得满足的JSF组件,而不是仅在渲染期间多次重复使用的组件.
<c:forEach varStatus="loop"> <my:compositeComponent id="myCC"> <h:panelGroup id="container_#{loop.index}"> Some content here (outputText,etc.) <ui:repeat id="innerlist_#{loop.index}"> <h:commandButton> <f:ajax render=":#{cc.clientId}:container_#{loop.index}" />
然而,这有其自身的含义,当然与复合组件一起使用时,以及在嵌套循环中使用时也是如此.您的代码不够完整,无法提供有关该代码的见解和建议.例如,当将这段代码放置在复合组件中时,它会断开,复合组件本身也在渲染时循环中重复使用多次.
也可以看看:
> JSTL in JSF2 Facelets… makes sense?
> How to find out client ID of component for ajax update/render? Cannot find component with expression “foo” referenced from “bar”