Ordem de execução de events ao pressionar PrimeFaces p: commandButton

Eu estou tentando executar um método de bean JSF2 e mostrar uma checkbox de diálogo após a conclusão do método ao clicar em PrimeFaces

.

 

 

Quando clico no botão de comando, o método setResultsForSelectedRow ouvinte de ação do bean é executado corretamente, mas não mostra a checkbox de diálogo quando o método é concluído. Se eu remover o actionlistener , ele mostrará a checkbox de diálogo. Eu não sei o que está errado.

Qual é a ordem de execução dos events? É possível executar actionlistener e actionlistener simultaneamente?

Ele falhou porque você usou ajax="false" . Isso triggers uma solicitação síncrona completa que, por sua vez, causa um recarregamento total da página, fazendo com que o oncomplete nunca seja triggersdo (observe que todos os outros atributos relacionados ao ajax como process , onsuccess , onerror , onerror e update também nunca são triggersdos).

Que funcionou quando você removeu actionListener também é impossível. Deveria ter falhado da mesma maneira. Talvez você também tenha removido ajax="false" sem realmente entender o que estava fazendo. Remover ajax="false" deve, de fato, atingir o requisito desejado.


Também é possível executar actionlistener e oncomplete simultaneamente?

Não. O script só pode ser triggersdo antes ou depois do ouvinte de ação. Você pode usar onclick para triggersr o script no momento do clique. Você pode usar o onstart para triggersr o script no momento em que a solicitação do ajax estiver prestes a ser enviada. Mas eles nunca serão exatamente simultaneamente triggersdos. A sequência é a seguinte:

  • Usuário clica no botão no cliente
  • código JavaScript onclick é executado
  • JavaScript prepara o pedido ajax baseado no process e na tree DOM atual do HTML
  • onstart código JavaScript do onstart é executado
  • JavaScript envia um pedido ajax do cliente para o servidor
  • JSF recupera pedido de ajax
  • O JSF processa o ciclo de vida da solicitação na tree de componentes JSF com base no process
  • actionListener método do bean de actionListener JSF é executado
  • action método do bean de apoio do JSF é executado
  • O JSF prepara a resposta ajax com base na update e na tree de componentes JSF atual
  • JSF envia resposta ajax do servidor para o cliente
  • JavaScript recupera a resposta ajax
    • se o status da resposta HTTP for 200, o código JavaScript de execução será executado
    • senão se o status da resposta HTTP for 500, o código JavaScript onerror será executado
  • JavaScript realiza a update base na resposta ajax e na tree HTML DOM atual
  • código JavaScript oncomplete é executado

Observe que a update é executada após actionListener , portanto, se você estiver usando onclick ou onstart para mostrar a checkbox de diálogo, ela ainda poderá exibir conteúdo antigo em vez de conteúdo atualizado, o que é ruim para a experiência do usuário. Em seguida, é melhor usar oncomplete para mostrar a checkbox de diálogo. Observe também que é melhor usar a action vez de actionListener quando você pretende executar uma ação de negócios.

Veja também:

  • Entendendo os processos / atualização de PrimeFaces e os atributos JSF f: ajax execute / render
  • Diferenças entre ação e açãoListener

Eu adoro receber informações como o BalusC dá aqui – e ele é gentil o suficiente para ajudar Tantas pessoas com TANTA BOA informação que eu considero suas palavras como evangelho, mas eu não pude usar essa ordem de events para resolver esse mesmo tipo de tempo. questão no meu projeto. Como a BalusC colocou aqui uma grande referência geral que eu mesmo reservei, pensei em doar minha solução para alguns problemas de tempo avançados no mesmo local, já que ela também resolve os problemas de tempo do pôster original. Espero que este código ajude alguém:

   Available Media Chosen Media     

A checkbox de diálogo está no topo da XHTML fora deste formulário e tem uma forma própria embutida na checkbox de diálogo junto com uma tabela de dados que contém comandos adicionais para transmitir a mídia que todos precisam ser preparados e prontos para serem usados ​​quando a checkbox de diálogo é apresentado. Você pode usar essa mesma técnica para fazer coisas como fazer o download de documentos personalizados que precisam ser preparados antes de serem transmitidos para o computador do usuário por meio dos botões fileDownload na checkbox de diálogo também.

Como eu disse, esse é um exemplo mais complicado, mas atinge todos os pontos altos do seu problema e o meu. Quando o botão de comando é clicado, o resultado é primeiro garantir que o bean de apoio seja atualizado com os resultados da pickList, depois informar ao bean de apoio para preparar streams para o usuário com base em suas seleções na lista de seleção e atualizar os controles a checkbox de diálogo dinâmica com uma atualização, mostre a checkbox de diálogo pronta para o usuário começar a transmitir seu conteúdo.

O truque para isso era usar a ordem de events do BalusC para o commandButton principal e então adicionar o bit para garantir que ele fosse executado primeiro – porque nada acontece corretamente a menos que o pickList atualize o bean de apoio primeiro (algo que não estava acontecendo para mim antes de adicioná-lo). Então, sim, o commandButton balança porque você pode afetar os componentes anteriores, pendentes e atuais, assim como os beans de apoio – mas o tempo para inter-relacionar todos eles não é fácil de se lidar, às vezes.

Codificação feliz!