5

我有两种形式的两个数据表,formaformg。在每个表单中都有 a p:dataTablegroupsagroupsg。在每个数据表中,都有一个自定义列显示名为favafavgh: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。

4

2 回答 2

10

前缀将:使其成为绝对客户端 ID,因此将相对于UIViewRoot而不是最近的 parent进行搜索NamingContainer。当您想要引用不在同一个最近的 parent 内的组件时,您应该(必须)使用它NamingContainer。和(and <h:form>)是组件。<h:dataTable><p:dataTable>NamingContainer

另请参阅如何找出组件的客户端 ID 以进行 ajax 更新/渲染?找不到从“bar”引用的表达式“foo”的组件以获取详细说明。

于 2012-09-11T10:48:48.030 回答
5

如果要从页面的根目录搜索 ID,请在开头使用冒号。当调用更新的组件不在被更新组件的同一个 NamingContainer 内时,这是必要的。

当您想相对于同一个 NamingContainer 进行搜索时,不要使用它。当两个组件(调用更新的组件和正在更新的组件)都在同一个 NamingContainer 中时,您可以这样做。

顺便说一句,“NamingContainers”是所有将其 ID 附加到其子组件的组件,例如<h:form><p:dataTable><p:accordionPanel>等。只需查看生成的 HTML 以查看父级是否将其 ID 附加到其子级。

于 2012-09-11T10:57:09.900 回答