【问题标题】:Primefaces - update datatable with commandButton doesn't workPrimefaces - 使用命令按钮更新数据表不起作用
【发布时间】:2011-12-31 18:58:02
【问题描述】:

我在使用命令按钮更新数据表时遇到了一些问题。这是 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 时。方法执行成功,删除用户。但是数据表没有更新。我希望删除的记录不再出现在 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;
        }
    }

【问题讨论】:

    标签: jsf primefaces datatable ajax-update


    【解决方案1】:

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

    所以,而不是一个人

    userService.removeUserById(id);
    

    你应该这样做

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

    【讨论】:

    • 非常感谢。我不知道为什么我忘记了。重新加载列表效果很好!
    【解决方案2】:

    看起来数据表没有刷新,尝试使用 update=":userLists" 或 update=":lists:userLists",':' 告诉它从 root 开始查找 id。目前它似乎找不到要更新的 id。相反,将它放在 p:outputPanel 中,给它一个 id,然后执行类似 update=":panel" 的操作。我想这会奏效。

    【讨论】:

      【解决方案3】:

      您似乎正在删除 db 中的用户,如果您使用一个,而不是从列表中删除 - #{listUsersController.users}...

      您应该发布方法中的代码:userService.removeUserById(id); 我不知道那里发生了什么,但如果您不更新用户列表,则数据表将永远不会(成功)更新!

      【讨论】:

        猜你喜欢
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-28
        • 1970-01-01
        • 2013-10-11
        • 1970-01-01
        相关资源
        最近更新 更多