Primefaces - 使用commandButton更新datatable无法正常工作

7

我遇到了一些问题,想通过一个commandButton更新datatable。以下是xhtml文件:

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

问题在于单击执行listUsersController.deleteUser操作的commandButton时。该方法已成功执行并删除用户。但是datatable未更新。我希望使用ajax将已删除的记录从列表中移除。
我已经尝试使用update="@form"update="@parent"update="@all"update="usersList"update=":list:usersList"进行测试,但均无效。
以下是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;
        }
    }
3个回答

11

在删除后,您需要重新从数据库中加载users

因此,不要单独执行删除操作。

userService.removeUserById(id);

你应该这样做

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

非常感谢。我不知道为什么会忘记那个。重新加载列表很好用! - jacruzca

1

看起来datatable没有刷新,试着使用update=":userLists"或update=":lists:userLists",':'告诉它从根开始查找id。目前看起来无法找到要更新的id。相反,将它放在一个p:outputPanel中,给它一个id,然后做类似于update=":panel"的操作。我想那会有用。


0

看起来你正在从数据库中删除用户,如果你使用的是一个而不是从列表中删除 - #{listUsersController.users}...

你应该发布方法的代码:userService.removeUserById(id);我无法确定里面发生了什么,但如果你没有更新用户列表,数据表将永远不会被(成功)更新!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接