6

I have two datatables in two forms, forma and formg. Inside each form there is a p:dataTable, groupsa and groupsg. In each datatable there is a custom column that displays an image(h:graphicImage) called fava and favg.

When the image is clicked, the images from the other datatable will be updated.

<p:ajax event="click" listener="#{agent.toogleFavorite}"
update="fava, :formg:groupsg:favg" />

Without the colon I get an exception:

javax.faces.FacesException: Cannot find component with identifier "forma:agentsa:fava" referenced from "groupsg:0:favg".

What is the difference between formg:groupsg:favg and :formg:groupsg:favg?

I am using JSF2.0 and PrimeFaces 3.4.

Seitaridis
  • 4,459
  • 9
  • 53
  • 85

2 Answers2

10

The : prefix will make it an absolute client ID and thus it will be searched relative to the UIViewRoot instead of the closest parent NamingContainer. You should (must) use it when you want to refer a component which is not inside the same closest parent NamingContainer. The <h:form> and <h:dataTable> (and <p:dataTable>) are NamingContainer components.

See also How to find out client ID of component for ajax update/render? Cannot find component with expression "foo" referenced from "bar" for a detailed explaination.

Community
  • 1
  • 1
BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
5

Use the colon at the beginning when you want to search for the ID from the root of the page. It is necessary when the component that is calling for the update is not inside the same NamingContainer of the component that is being updated.

Don't use it when you want to search relatively to the same NamingContainer. You can do that when both components (the one calling the update and the one being updated) are inside the same NamingContainer.

By the way, "NamingContainers" are all the components that prepend their ID to their child components, like <h:form>, <p:dataTable>, <p:accordionPanel>, etc. Just look at the generated HTML to see if the parent is prepending its ID to its childs.

RinaldoDev
  • 985
  • 6
  • 21