Primefaces-обновление datatable с помощью 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>
проблема возникает при нажатии кнопки commandButton, которая выполняет действие listUsersController.deleteUser. Метод успешно выполняется и пользователь удаляется. Но 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 ответов
вам нужно перезагрузить users
из БД после удаления.
Итак, вместо одного
userService.removeUserById(id);
вы должны сделать
userService.removeUserById(id);
users = userService.list();
Кажется, вы удаляете пользователя в db, если вы его используете, а не из списка - #{listUsersController.users}
...
вы должны опубликовать код из метода:userService.removeUserById(id);
Я не могу сказать, что там происходит, но если вы не обновляете список пользователей, dataTable никогда не будет (успешно) обновлен!
похоже, что datatable не обновляется, попробуйте использовать update=": userLists"или update=": lists: userLists",":", говоря ему искать идентификатор, начиная с root. В настоящее время похоже, что он не может найти идентификатор для обновления. Скорее, поместите его в p:outputPanel, дайте ему идентификатор, а затем сделайте что-то вроде update=": panel". Думаю, это сработает.