Como os Seletores PrimeFaces como em update = “@ (.myClass)” funcionam?

Eu não entendo como os seletores PrimeFaces ( PFS ) funcionam.

 

Eu posso usar isso. E eu acho que é uma ferramenta fantástica, embora não funcione sempre para mim. O .myClass é o seletor jQuery do lado do cliente. Como o JSF no lado do servidor sabe o que atualizar?

Eu posso entender como funcionam os seletores normais de ID do JSF .

  

O textId referência a um ID de componente na tree de componentes conforme definido no arquivo XHTML no lado do servidor. Então eu posso entender como o JSF encontra o componente certo.

Mas se você estiver usando seletores de primefaces, os seletores jQuery do lado do cliente serão usados. Como o JSF sabe qual componente precisa ser atualizado? Às vezes tenho problemas com o PFS. Não parece funcionar sempre para mim. Existe algo que você deve ter em mente se estiver usando o PFS?

Você provavelmente já sabe que o PrimeFaces está usando o jQuery sob as capas. Seletores PrimeFaces são baseados em jQuery. Tudo o que você especificar em @(...) será usado como seletor de jQuery na tree HTML DOM atual. Para qualquer elemento HTML encontrado, que tenha um ID, exatamente esse ID será usado na update .

Basicamente, para uma update="@(.myclass)" , o PrimeFaces irá sob as capas aproximadamente:

 var $elements = $(".myclass"); var clientIds = []; $.each($elements, function(index, element) { if (element.id) { clientIds.push(":" + element.id); } }); var newUpdate = clientIds.join(" "); // This will be used as `update` instead. 

Então, no caso de por exemplo

      

esta atualização do botão de comando

  

vai acabar com exatamente o mesmo efeito que

  

Observe que isso também funciona para IDs gerados automaticamente. Ou seja, o não é obrigatório.


Às vezes eu tenho um problema com o PFS. Existe algo que você deve ter em mente se estiver usando o PFS?

Pode acontecer que você tenha selecionado “muito” (por exemplo, @(form) não seleciona o formulário atual, mas todos os formulários, exatamente como $("form") em jQuery!), Ou que você realmente selecionou nada (quando o desejado O elemento HTML DOM na verdade não tem ID). Investigando IDs de elemento na tree DOM do HTML e a carga útil do pedido no monitor de tráfego HTTP, o deve fornecer dicas.

Os elementos desejados na tree HTML DOM devem ter um ID (gerado automaticamente). O parâmetro de solicitação javax.faces.partial.render no monitor de tráfego HTTP deve conter os IDs corretos do cliente. O atributo rendered do elemento na tree de componentes JSF deve avaliar true durante a atualização. Etcetera.

Em seu exemplo específico, o não terminará na saída HTML gerada com qualquer ID. Atribuir um id deve resolver seu problema com a atualização.

Então, esse exemplo não funciona

     

mas este exemplo funcionará (note que atribuir um formulário a um ID não é necessário):