Uso de ":" (dois pontos) no update do primefaces

Pessoal, bom dia.

No primefaces, para atualizar uma tela, qual a diferença de usar o “:”?

update=":messages"
update="messages"

Obrigado.

Basicamente, quando não tem : o componente é buscado de forma relativa, e com o :, de forma absoluta. Os exemplos abaixo foram descaradamente copiados daqui (que inclusive, tem uma explicação muito mais detalhada, recomendo a leitura).

Enfim, sem o : a busca é feita de forma relativa. Ou seja, se ambos os elementos tem o mesmo pai (para ser mais preciso, se ambos estão dentro do mesmo NamingContainer), eu posso buscá-los assim:

<h:form id="form">
    <p:commandLink update="result"> <!-- OK! -->
    <h:panelGroup id="result" />
</h:form>

Pois a busca é “relativa”, feita dentro do elemento pai.

Mas se eles tiverem pais diferentes (não estão no mesmo NamingContainer), isso não funciona:

<h:form id="form">
    <p:commandLink update="result"> <!-- FAIL! -->
</h:form>
<h:panelGroup id="result" />

Pois o update estará procurando pelo id="result" dentro do mesmo componente pai (no caso, o h:form). Mas como ele está fora, não é encontrado.

Neste caso, precisamos do : para que a busca seja feita de forma “absoluta”:

<h:form id="form">
    <p:commandLink update=":result"> <!-- OK! -->
</h:form>
<h:panelGroup id="result" />

Agora ele encontra o result, mesmo estando fora do h:form.


Lembrando que o caminho deve ser completo. Por exemplo, se o result estivesse dentro de outro elemento:

<h:form id="form">
    <p:commandLink update=":result"> <!-- FAIL! -->
</h:form>
<h:form id="otherform">
    <h:panelGroup id="result" />
</h:form>

Agora não funciona porque o result está dentro de otherform, e para referenciá-lo eu preciso usar o caminho completo (que no caso seria :otherform:result):

<h:form id="form">
    <p:commandLink update=":otherform:result"> <!-- OK! -->
</h:form>
<h:form id="otherform">
    <h:panelGroup id="result" />
</h:form>
1 curtida