我具有以下结构(省略了内容和属性):
<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 -->
由于容器内的内容取决于内部列表按钮的操作,因此我需要对其进行更新。当没有external时,上述方法有效ui:repeat。但是,如果有一个,它将失败并显示component not found错误。
ui:repeat
component not found
这似乎是由于cc.clientIdthen本身包含外部的行索引ui:repeat,例如outerlist:0:myCC:container。至于这个答案评论指出,这个索引ID是不是在视图树的服务器端表示可用。而是“行索引仅存在于客户端”。我必须承认,我不太了解此索引的完成方式以及服务器端可用的内容。
cc.clientId
outerlist:0:myCC:container
所以我的问题是:JSF如何执行此索引,它如何(在服务器上)分隔a内的不同“实例” ui:repeat,是否有解决上述代码的方法?
在指定的客户端ID <f:ajax>必须是可用 两个 由JSF的服务器端
<f:ajax>
facesContext.getViewRoot().findComponent(clientId);
(以便可以找到它以便为ajax响应呈现其新的HTML表示形式)
并 在客户端通过JavaScript的
document.getElementById(clientId);
(以便一旦具有新HTML内容的ajax响应到达,它就可以由JS更新/替换)
由于<ui:repeat>仅在视图渲染期间运行,因此具有行索引的客户端ID在服务器端不表示有效的组件(错误消息来自“无法找到组件…” findComponent(),但在客户端中却表示有效的HTML元素) 。基本上,您将需要客户端ID,而服务器端没有行索引,客户端ID需要有行索引。但这只是行不通的,<ui:repeat>因为(不幸的)无法单独选择特定迭代回合的组件树状态findComponent()。
<ui:repeat>
findComponent()
在使用JSTL <c:forEach>并在视图构建期间运行时动态分配组件ID 时,它应该工作正常,并且实际上在视图树中生成了多个有价值的JSF组件,而不是仅在渲染过程中多次重复使用一个组件。
<c:forEach>
<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}" />
但是,这有其自身的含义,当然,当与复合组件一起使用以及在嵌套循环中使用时也是如此。您的代码不够完整,无法提供有关此方面的见识和建议。例如,将这段代码放在复合组件中会中断,该组件本身也会在渲染时间循环中多次重复使用。