何时使用冒号前缀表单id

Sei*_*dis 5 java ajax jsf primefaces

我有两个数据表,有两种形式,formaformg.每个表单里面都有一个p:dataTable,groupsagroupsg.在每个DataTable有显示图像(自定义列h:graphicImage)称为蚕豆favg.

单击图像时,将更新来自其他数据表的图像.

<p:ajax event="click" listener="#{agent.toogleFavorite}"
update="fava, :formg:groupsg:favg" />
Run Code Online (Sandbox Code Playgroud)

没有冒号,我得到一个例外:

javax.faces.FacesException: Cannot find component with identifier "forma:agentsa:fava" referenced from "groupsg:0:favg".
Run Code Online (Sandbox Code Playgroud)

formg:groupsg:favg和:formg:groupsg:favg有什么区别?

我使用的是JSF2.0和PrimeFaces 3.4.

Bal*_*usC 10

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

另请参见如何查找ajax update/render的组件的客户端ID?无法找到具有"bar"引用的表达式"foo"的组件以进行详细说明.


Rin*_*PJr 5

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

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

顺便说一句,"NamingContainers"是所有预先考虑自己的ID,以他们的子组件的组件,如<h:form>,<p:dataTable>,<p:accordionPanel>,等.试想一下,在生成的HTML,看看是否父前面加上其ID为它的子.