[PRIMEFACES] p:commandButton soh é invocado no segundo clique...pq?

11 respostas
T

Dale galera, estou com um problema bizarro aqui que nao encontro a solução.

tenho um Bean gerenciavel (SessionScoped) e uma página jsf com primefaces, a qual quero que no dataTable ao clicar no botão da linha respectiva, me traga o valor da linha… simples…
Porém ao clicar no botão pela primeira vez não me trás nada, somente na segunda vez envia o valor correto.

Vou copiar o meu bean e a commandButton para vocês conseguirem visualizar melhor.

OBrigado desde já.

pagina

<h:form id="formListUser" prependId="false"> 

                <p:growl id="msgs" showDetail="true" showSummary="true"> </p:growl>
                <br />
                <p:dataTable id="userTable" var="user" value="#{userController.listUsers}" widgetVar="userList"   
                             paginator="true" rows="20"
                             paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"  
                             rowsPerPageTemplate="10,20,40"
                             filteredValue="#{userController.listFilteredUsers}">

                    <f:facet name="header"> 
                        User List
                        <p:outputPanel>  
                            <h:outputText value="Search all fields: " />  
                            <p:inputText id="globalFilter" onkeyup="userList.filter()" style="width:150px; margin-right: 10px;" />  
                        </p:outputPanel>  
                    </f:facet> 

                    <p:column id="listUserId" sortBy="#{user.id}" filterBy="#{user.id}" filterMatchMode="startsWith">  
                        <f:facet name="header">  
                            <h:outputText value="Id" />  
                        </f:facet>  
                        <h:outputText value="#{user.id}" />  
                    </p:column>
                    <p:column id="listUserName" sortBy="#{user.name}" filterBy="#{user.name}" filterMatchMode="startsWith">  
                        <f:facet name="header">  
                            <h:outputText value="Name" />  
                        </f:facet>  
                        <h:outputText value="#{user.name}" />  
                    </p:column>
                    <p:column id="listUserEmail" sortBy="#{user.email}" filterBy="#{user.email}" filterMatchMode="startsWith">  
                        <f:facet name="header">  
                            <h:outputText value="Email" />  
                        </f:facet>  
                        <h:outputText value="#{user.email}" />  
                    </p:column>
                    
                    <p:column style="width:120px">  

                        <p:commandButton id="editUserBtn" oncomplete="editUser.show();"
                                         icon="ui-icon-pencil" title="Edit" update=":formEditUser:displayEditUser">
                            <f:setPropertyActionListener value="#{user}" target="#{userController.selectedUser}"  />

                        </p:commandButton>

                     

                    </p:column>
                </p:dataTable>
   </h:form>

           <p:dialog header="Edit User" widgetVar="editUser" resizable="false" id="editUserDialog"> 
                <h:form id="formEditUser" prependId="false">
                    <h:panelGrid id="displayEditUser" columns="2" cellpadding="4" style="margin:0 auto;">
                        <h:outputText value="Name" />  
                        <h:outputText value="#{userController.selectedUser.name}" style="font-weight:bold"/> 
                    </h:panelGrid>
                </h:form>
            </p:dialog>

bean


Mojarra 2.1.6 (SNAPSHOT 20111206)
PrimeFaces 3.4.1
Glassfish 3.1.2

11 Respostas

I

tenta colocar um ajax=false no commandButton

I

vc não disparou nenhum evento no botão, a primeira vez ele só vai enviar o valor a na segunda é que ele vai chama o oncomplete.

Faça assim

<p:commandButton id="editUserBtn" oncomplete="editUser.show();" actionListener="#{userController.setSelectedUser(user)}" 
                                         icon="ui-icon-pencil" title="Edit" update=":formEditUser:displayEditUser">    
                        </p:commandButton>
T

Já tentei… aí ele não trás nem o modal, pois ele acha que eh regra de navegação de páginas… obrigado mesmo assim

T
ismael.costa:
vc não disparou nenhum evento no botão, a primeira vez ele só vai enviar o valor a na segunda é que ele vai chama o oncomplete.

Faça assim

<p:commandButton id="editUserBtn" oncomplete="editUser.show();" actionListener="#{userController.setSelectedUser(user)}" 
                                         icon="ui-icon-pencil" title="Edit" update=":formEditUser:displayEditUser">    
                        </p:commandButton>

Continua na mesma... ele carrega vazio... depois no segundo click trás o valor... mas obrigado pela tentativa!

A

Já testou adicionar seu p:dialog dentro do form que esta o dataTable?

<h:form id="formListUser" prependId="false">   
      
                    <p:growl id="msgs" showDetail="true" showSummary="true"> </p:growl>  
                    <br />  
                    <p:dataTable id="userTable" var="user" value="#{userController.listUsers}" widgetVar="userList"     
                                 paginator="true" rows="20"  
                                 paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"    
                                 rowsPerPageTemplate="10,20,40"  
                                 filteredValue="#{userController.listFilteredUsers}">  
      
                      //seus dados...
                          
                        <p:column style="width:120px">    
      
                            <p:commandButton id="editUserBtn" oncomplete="editUser.show();"  
                                             icon="ui-icon-pencil" title="Edit" update=":formEditUser:displayEditUser">  
                                <f:setPropertyActionListener value="#{user}" target="#{userController.selectedUser}"  />  
      
                            </p:commandButton>  
      
                           
      
                        </p:column>  
                    </p:dataTable>  

<p:dialog header="Edit User" widgetVar="editUser" resizable="false" id="editUserDialog">   
                    <h:form id="formEditUser" prependId="false">  
                        <h:panelGrid id="displayEditUser" columns="2" cellpadding="4" style="margin:0 auto;">  
                            <h:outputText value="Name" />    
                            <h:outputText value="#{userController.selectedUser.name}" style="font-weight:bold"/>   
                        </h:panelGrid>  
                    </h:form>  
                </p:dialog>  
       </h:form>
R
T
aprendizweb:
Já testou adicionar seu p:dialog dentro do form que esta o dataTable?
<h:form id="formListUser" prependId="false">   
      
                    <p:growl id="msgs" showDetail="true" showSummary="true"> </p:growl>  
                    <br />  
                    <p:dataTable id="userTable" var="user" value="#{userController.listUsers}" widgetVar="userList"     
                                 paginator="true" rows="20"  
                                 paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"    
                                 rowsPerPageTemplate="10,20,40"  
                                 filteredValue="#{userController.listFilteredUsers}">  
      
                      //seus dados...
                          
                        <p:column style="width:120px">    
      
                            <p:commandButton id="editUserBtn" oncomplete="editUser.show();"  
                                             icon="ui-icon-pencil" title="Edit" update=":formEditUser:displayEditUser">  
                                <f:setPropertyActionListener value="#{user}" target="#{userController.selectedUser}"  />  
      
                            </p:commandButton>  
      
                           
      
                        </p:column>  
                    </p:dataTable>  

<p:dialog header="Edit User" widgetVar="editUser" resizable="false" id="editUserDialog">   
                    <h:form id="formEditUser" prependId="false">  
                        <h:panelGrid id="displayEditUser" columns="2" cellpadding="4" style="margin:0 auto;">  
                            <h:outputText value="Name" />    
                            <h:outputText value="#{userController.selectedUser.name}" style="font-weight:bold"/>   
                        </h:panelGrid>  
                    </h:form>  
                </p:dialog>  
       </h:form>

Sim tentei fazer um único form ... mesmo comportamento... obrigado mesmo assim

T

Obrigado, já tinha visto esse post e checado todos os passos citados nele, mesmo assim obrigado.

V

estou com o mesmo problema com o DataList para Mobile :cry:
Nao consegui resolver ainda…
Se vc tiver a solucao, posta ai pra gente

:wink:

E

Tópico antigo… to tendo esse mesmo problema. Alguém conseguiu resolver ?

dei uma olhada nesse link, referente ao jsf 2.0/2.1 parece que isso é um bug do jsf. No tópico ele fala sobre usar um script para corrigir o erro. Porém não sei direito como fazer isso,

se alguém puder ajudar, eu agradeço :slight_smile:

P

eu achava melhor vc ter aberto outra thread e referenciado esta.

Quanto ao problema, vc está fazendo alguma mudança de página por ajax ? Já tive problemas por conta disso.

Criado 1 de novembro de 2012
Ultima resposta 10 de abr. de 2013
Respostas 11
Participantes 8