我有两种形式的数据表, forma 和 formg 。每个表单中都有p:dataTable
, groupsa 和 groupsg 。在每个数据表中都有一个自定义列,显示名为 fava 和 favg 的图像(h:graphicImage
)。
单击图像时,将更新其他数据表中的图像。
<p:ajax event="click" listener="#{agent.toogleFavorite}"
update="fava, :formg:groupsg:favg" />
没有冒号,我得到一个例外:
javax.faces.FacesException: Cannot find component with identifier "forma:agentsa:fava" referenced from "groupsg:0:favg".
formg:groupsg:favg和:formg:groupsg:favg?
之间有什么区别?我正在使用JSF2.0和PrimeFaces 3.4。
答案 0 :(得分:9)
:
前缀将使其成为绝对客户端ID,因此将相对于UIViewRoot
而不是最近的父NamingContainer
进行搜索。当您想要引用不在同一个最近的父NamingContainer
内的组件时,您应该(必须)使用它。 <h:form>
和<h:dataTable>
(以及<p:dataTable>
)是NamingContainer
个组件。
答案 1 :(得分:5)
如果要从页面根目录中搜索ID,请在开头使用冒号。当正在调用更新的组件不在正在更新的组件的同一NamingContainer中时,这是必要的。
当您想要相对搜索相同的NamingContainer时,请不要使用它。当两个组件(调用更新的组件和正在更新的组件)位于同一个NamingContainer中时,您可以这样做。
顺便说一句,“NamingContainers”是将其ID添加到其子组件的所有组件,例如<h:form>
,<p:dataTable>
,<p:accordionPanel>
等。只需查看生成的HTML查看父母是否将其ID添加到其子项。