2011-11-17 23 views
6

Tengo algunos problemas al actualizar una tabla de datos con un CommandButton. Este es el archivo XHTML:Primefaces - actualizar datatable con commandButton no funciona

<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> 

El problema es cuando se hace clic en el CommandButton que realiza la listUsersController.deleteUser acción. El método se ejecuta con éxito y el usuario se elimina. Pero la tabla de datos no está actualizada. Quiero que el registro eliminado ya no aparezca en la lista con ajax.

ya probado con update="@form", update="@parent", update="@all", update="usersList", update=":list:usersList" y nada funciona.

Este es el método en el 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; 
     } 
    } 

Respuesta

9

Necesita volver a cargar users de la base de datos después de la eliminación.

Así, en lugar de solo

userService.removeUserById(id); 

que debe hacer

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

Muchas gracias. No sé por qué lo olvidé. Recargar la lista funciona muy bien! – jacruzca

0

Parece que va a eliminar el usuario en dB, si se utiliza uno, y no de la lista - #{listUsersController.users} ...

Usted debe publique el código del método: userService.removeUserById(id); No puedo decir qué está sucediendo allí, pero si no está actualizando la lista de usuarios, ¡la dataTable nunca se actualizará (con éxito)!

+0

Gracias. Olvidé actualizar la lista. Ahora funciona. – jacruzca

0

Parece que la tabla de datos no es refrescante, intente utilizar update = ": listas de usuarios" o update = ": lists: userLists", el ':' diciéndole que busque la ID a partir de la raíz. Actualmente parece que no puede encontrar la ID para actualizar. Más bien, póngalo en un p: outputPanel, asígnele un id y luego haga algo como update = ": panel". Supongo que eso funcionará.

Cuestiones relacionadas