前端之家收集整理的这篇文章主要介绍了
ajax – 如何处理循环命名容器中的组件,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_
502_0@
我有以下结构(
内容和
属性省略):
<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内部的不同“实例”分开:重复,是否有解决方案,我想用上面的代码实现什么?
< f:ajax>中指定的客户端ID必须在JSF的服务器端都可用
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”