何时使用冒号前缀表单id

时间:2012-09-11 10:21:40

标签: java ajax jsf primefaces

我有两种形式的数据表, 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。

2 个答案:

答案 0 :(得分:9)

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

另见How to find out client ID of component for ajax update/render? Cannot find component with expression "foo" referenced from "bar"详细解释。

答案 1 :(得分:5)

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

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

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