2011-11-17 17 views
6

Sto affrontando alcuni problemi aggiornando un datatable con un commandButton. Questo è il file xhtml:Primefaces - aggiornamento datatable con commandButton non funziona

<div class="grid_16"> 
    <h:form id="list"> 
     <p:messages></p:messages> 
     <p:dataTable styleClass="result-table" var="user" id="usersList" 
     value="#{listUsersController.users}" widgetVar="userTable" 
     paginator="true" rows="10" paginatorAlwaysVisible="false"> 
     <f:facet name="header"> 
      Listado de usuarios 
     </f:facet> 
     <p:column> 
      <f:facet name="header"> 
       <h:outputText value="#{cms['users.username']}" /> 
      </f:facet> 
      #{user.username} 
     </p:column> 
     <p:column> 
      <f:facet name="header"> 
       <h:outputText value="#{cms['users.name']}" /> 
      </f:facet> 
      #{user.name} 
     </p:column> 
     <p:column> 
      <f:facet name="header"> 
       <h:outputText value="#{cms['users.lastname']}" /> 
      </f:facet> 
      #{user.lastname} 
     </p:column> 
     <p:column> 
      <f:facet name="header"> 
       <h:outputText value="#{cms['users.active']}" /> 
      </f:facet> 
      #{user.active} 
     </p:column> 
     <p:column> 
      <f:facet name="header"> 
       <h:outputText value="#{cms['general.actions']}" /> 
      </f:facet> 
      <p:commandButton value="Eliminar" image="ui-icon-trash" 
       actionListener="#{listUsersController.deleteUser}" 
       update="list:usersList"> 
       <f:param name="user" value="#{user.id}" /> 
      </p:commandButton> 
     </p:column> 
     </p:dataTable> 
    </h:form> 
</div> 

Il problema è quando si fa clic sul pulsante di comando che esegue l'listUsersController.deleteUser azione. Il metodo viene eseguito correttamente e l'utente viene eliminato. Ma il datatable non è aggiornato. Voglio che il record cancellato non compaia più nell'elenco con ajax.

ho già provato con update="@form", update="@parent", update="@all", update="usersList", update=":list:usersList" e niente funziona.

questo è il metodo nella managedBean:

public String deleteUser() { 
     try { 
      FacesContext fc = FacesContext.getCurrentInstance(); 
      Map<String, String> params = fc.getExternalContext().getRequestParameterMap(); 
      int id = Integer.parseInt(params.get("user")); 
      userService.removeUserById(id); 
      FacesContext.getCurrentInstance().addMessage 
      (null,new FacesMessage(FacesMessage.SEVERITY_INFO,MessageProvider.getMessageProvider() 
      .getValue("cms","users.error.userDoesNotExist"),"")); 
      return SUCCESS; 
     } catch (EntityNotFoundException e) { 
      FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_ERROR,MessageProvider 
        .getMessageProvider().getValue("cms","users.error.userDoesNotExist"),"")); 
      return ERROR; 
     } 
    } 

risposta

9

È necessario ricaricare users dal DB dopo l'eliminazione.

Così, invece di sola

userService.removeUserById(id); 

si dovrebbe fare

userService.removeUserById(id); 
users = userService.list(); 
+0

Grazie mille. Non so perché l'ho dimenticato. Ricaricare la lista funziona alla grande! – jacruzca

0

Sembra si elimina l'utente nel db, se si utilizza uno, e non dalla lista - #{listUsersController.users} ...

Si dovrebbe inserisci il codice dal metodo: userService.removeUserById(id); Non riesco a capire cosa sta succedendo lì ma se non stai aggiornando l'elenco degli utenti, il dataTable non sarà mai aggiornato (con successo)!

+0

Grazie. Ho dimenticato di aggiornare la lista. Ora sta funzionando. – jacruzca

0

Sembra che il datatable non si aggiorni, provare a utilizzare update = ": liste utenti" o update = ": liste: liste utenti", il ":" dicendogli di cercare l'id a partire da root. Attualmente sembra che non riesca a trovare l'ID da aggiornare. Piuttosto, mettilo in un p: outputPanel, dagli un id e poi fai qualcosa come update = ": panel". Immagino che funzionerà.

Problemi correlati