Problema ciclo de vida ajax com primefaces

11 respostas
faelbsr

Estou com o seguinte problema em uma aplicação utilizando o primefaces…

Tenho vários componentes que utilizam da tag <p:ajax> e outros commandobuttons e commandlinks que também fazem requisição ajax…

Acontece que quando eu vou inserir um componente novo que também deverá fazer uma requisição ajax, essa requisição não é disparada quando solicitada. Ela é disparada somente se uma outra requisição for feita por outros componentes…

Alguém já teve esse problema e sabe como resolver… já estou perdendo o juízo por conta disto…

obrigado…

11 Respostas

Hebert_Coelho

Não entendi.

Você está querendo dizer que tem um h:commandButton para disparar a ação e quer que ao adicionar outro button, por exemplo, ele tb utilize ajax?

faelbsr

Não cara… vou explicar melhor…

Eu já tenho vários componentes que fazem requisições ajax e preciso adicionar mais componentes que fazem requisições ajax também…

Imagine o seguinte cenário…

O código abaixo tem dois commandButtons.

O primeiro quando clicado chama o método 1 do meuBean e imprime “Executando o método 1”;

O segundo quando clicado chama o método 2 do meuBean e imprime “Executando o método 2”;

<p:commandButton update=":form,:algum_componente" actionListner="#{meuBean.método1}" value="Requisição 1"></p:commandoButton>

<p:commandButton update=":form,:algum_componente" actionListner="#{meuBean.método2}" value="Requisição 2"></p:commandoButton>

Até ai está tudo certo.

O problema começa quando eu adiciono um novo componente, por exemplo um terceiro commandButton. Pois ao clicar no terceiro commandButton deveria imprimir “Executando o método 3” quando na verdade não imprime nada…

Porém ao clicar no commandButton 3 e depois clicar em outro commando button, por exemplo o commandbutton 1 , a aplicação imprime -> “Executando o método 1 , Executando o método 3”…

<p:commandButton update=":form,:algum_componente" actionListner="#{meuBean.método3}" value="Requisição 3"></p:commandoButton>

Acredito que engine do primefaces está se perdendo com as requisições ou eu não estou sabendo se há alguma configuração para acertar isto…

Hebert_Coelho

não sei se é engine do primefaces uma vez que ele utiliza o Mojara para controle disso.

  1. no JSF comum você separa por espaço em branco e não vírgulas. Tente alterar e tente isso.
  2. tente colocar immediate=true no seus botões e veja se vai.
faelbsr

Funfo não camarada…

mas de qualquer forma vlw pela ajuda ai…

faelbsr

Tem algo muito curioso neste problema…

Veja, se eu coloco o meu commandoButton 3 para executar o método do commandButton 2 ou 1 ele executa sem problemas…

Outras vezes ao trocar o nome do método funcionou… (Por isso minha desconfiança em ser bug no primefaces)

leonardobhbr

amigo poste o codigo todo da sua pagina, voce esta rodando em qual browser?
e onde esta a tag :pajax

tiago.vt

pode está acontecendo que o botão está renderizando o componente com o novo botão, experimenta coloca 1 outputpanel fora do componente que vc quer renderizar e manda o botao novo renderiza esse outputpanel…

faelbsr
<h:column>                        
                        <div style="width:100%; text-align:right">
                            <p:inputText styleClass="pedido_fields_currency" value="#{dtPessoaFaces.estoque.quantidade}">
                                <f:convertNumber maxFractionDigits="3" minFractionDigits="2"/>
                                <p:ajax  update=":form1:dt_products,:formd:edit_total" event="blur" listener="#{dtPessoaFaces.recalcular()}"></p:ajax>
                            </p:inputText>
                        </div>
</h:column>


<p:inputText id="edit_unitario" styleClass="pedido_fields_currency" value="#{dtPessoaFaces.estoque.unitario}">
                                <f:convertNumber maxFractionDigits="3" minFractionDigits="2"/>
                                <p:ajax  update=":form1:dt_products,:formd:edit_total,:formd:edit_desconto" event="blur" listener="#{dtPessoaFaces.recalcularByUnitarioEdit()}"></p:ajax>
</p:inputText>

Ai estão algumas partes que eu uso o p:ajax, é impossível postar o código todo pois é imenso…

Eu estou usando o chrome e o firefox como navegador…

Já atualizei a versão do primefaces pra m4 e mesmo assim não funfa

leonardobhbr

sua pagina esta assim

<f:view contentType="text/html">
<h:head>
</h:head>

<h:body>
</h:body>
</f:view>

Repare a tag f:view antes do head

e ao invés de head é h:head
e ao invés de body é h:body

faelbsr

Eu estou usando um template, vou postar…

TEMPLATE

<?xml version='1.0' encoding='ISO-8859-1' ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets" 
      xmlns:f="http://java.sun.com/jsf/core">

    <ui:composition template="template.xhtml">            

        <ui:define name="navigationBar">
            <h:form>            
                #{loginFaces.loadEmpresaId()}
            </h:form>            
        </ui:define>        

        <ui:define name="content">                

            <h:form> 

                <div id="form_login">
                    <h:panelGrid border="0">

                        <h:column>
                            <h:outputText value="Login:"></h:outputText>
                            <p:inputText value="#{loginFaces.login}"></p:inputText>
                        </h:column>

                        <h:column>
                            <h:outputText value="Senha:"></h:outputText>
                            <p:password feedback="false" value="#{loginFaces.senha}"></p:password>
                        </h:column>

                        <h:column>

                            <h:outputText value="Eu sou: "></h:outputText> 
                            <p:selectOneMenu value="#{loginFaces.selectedTypeOfUsers}" var="p">
                                <f:selectItems value="#{loginFaces.listOfUserTypes}"></f:selectItems>                        
                                <f:converter converterId="TypeOfUsersConverter"></f:converter>
                                <p:column>
                                    #{p.description}
                                </p:column>
                                <p:column>
                                    <p:graphicImage url="/resources/img/#{p.pathOfImg}"></p:graphicImage>
                                </p:column>
                            </p:selectOneMenu>                                                                                    

                        </h:column>                                                                                                
                    </h:panelGrid> 

                    <div style="position: relative; left: 70px; top: 10px">
                        <p:commandLink ajax="false" action="#{loginFaces.doLogin}">                            
                            <p:graphicImage url="/resources/img/botao_entrar.png"></p:graphicImage>
                        </p:commandLink>                                                                             
                    </div>
                </div>                
            </h:form>            
        </ui:define>        
    </ui:composition>

</html>

ALGUMA OUTRA PÁGINA

<?xml version='1.0' encoding='ISO-8859-1' ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets" 
      xmlns:f="http://java.sun.com/jsf/core">

    <ui:composition template="/template.xhtml">            

        <ui:define name="navigationBar">
            <h:form>            
                MENU
            </h:form>            
        </ui:define>        

        <ui:define name="content">                
           CONTEÚDO   
        </ui:define>        
    </ui:composition>

</html>

é correto fazer assim?

faelbsr

Galera… deu certo agora, realmente eu não sei qual é o problema e nem qual a solução… fiz o que o tiago falou e deu certo… Entretanto o meu System.out.print() continua imprimindo só depois que é acionado algum componente depois do que eu quero que realmente seja executado…

vlw todo mundo ai…

Criado 21 de novembro de 2011
Ultima resposta 21 de nov. de 2011
Respostas 11
Participantes 4