gpt4 book ai didi

jsf - 使用 LazyDataModel 的 Primefaces 数据表未更新。似乎没有调用加载方法

转载 作者:行者123 更新时间:2023-12-04 21:51:24 25 4
gpt4 key购买 nike

我正在使用使用 LazyDataModel 的 primefaces 4.0 数据表。我也在使用 <p:rowEditor />当一行被编辑和保存时,我的数据表数据没有被更新。似乎没有在 ajax 更新上调用 LazyDataModel.load 方法。

有什么我做错了或解决方法吗?这是一个已知问题吗?

懒惰用户数据模型.java

public class LazyUserDataModel extends LazyDataModel<User> {

private static final long serialVersionUID = -7759670987463023731L;
private List<User> users;
private Dao dao;
private String username;
private List<String> roles;

public LazyUserDataModel(Dao dao, String username, List<String> roles) {
this.dao = dao;
this.username = username;
this.roles = roles;
}

@Override
public List<User> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) {

List<User> users = new ArrayList<User>();
users = dao.findAllUsers(username, roles, first, pageSize);
...

UserGroupBacking.java
...
private LazyDataModel<User> users;

@PostConstruct
public void init() {
this.ds = databaseBacking.getDs();
if(isLoggedIn()) {
loadData();
}
}

public void updateUsersGroups(RowEditEvent event) {
// Save data to db (this part works fine)
loadData();
}

private void loadData() {
Dao dao = new Dao(ds);
users = new LazyUserDataModel(dao, accessBacking.getUsername(), accessBacking.getRoles());
}
...

.xhtml
<p:tabView id="tabs">

<p:tab id="userTab" title="Users">
<h:form id="userForm">

<p:growl for="growl" severity="info" autoUpdate="true" showDetail="true" />
<p:messages id="userMessages" severity="error" showDetail="true" />

<p:dataTable var="user" value="#{userGroupBacking.users}" editable="true" id="userTable" paginator="true" rows="20"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}" lazy="true"
filteredValue="#{userGroupBacking.filteredUsers}" >

<p:ajax event="rowEdit" listener="#{userGroupBacking.updateUsersGroups}" update=":tabs:userForm:userTable, :tabs:userForm:userMessages" />

<p:column headerText="User" filterBy="#{user.name}" filterMatchMode="contains">
<h:outputText value="#{user.name}" />
</p:column>

<p:column headerText="Groups">
<p:cellEditor>
<f:facet name="output">
<ui:repeat var="group" value="#{user.groups}">
<h:outputText value="#{group.name}" /><br />
</ui:repeat>
</f:facet>
<f:facet name="input">
<p:selectCheckboxMenu value="#{user.groupsAsString}" label="Groups" filter="true" filterText="Filter" filterMatchMode="contains">
<f:selectItems value="#{userGroupBacking.groupsAsSelectItems}" />
</p:selectCheckboxMenu>
</f:facet>
</p:cellEditor>
</p:column>
...

最佳答案

看来<p:ajax event="rowEdit">表内的设计不会更新除已编辑行以外的任何内容。甚至不是由 update 明确指定的属性。它会被直接忽略。这可能是有道理的,但这是 IMO 过于热心,值得一个问题报告。

我在源代码中进行了一些挖掘,但似乎不太容易和很好地改变/覆盖这种行为。最好的办法是在单独的 ajax 请求中执行整个表的更新。 <p:remoteCommand>在这方面很有帮助。

代替

<p:dataTable id="userTable" ...>
<p:ajax event="rowEdit" listener="#{userGroupBacking.updateUsersGroups}" update=":tabs:userForm:userTable, :tabs:userForm:userMessages" />
...
</p:dataTable>


<p:remoteCommand name="updateUsersGroups" action="#{userGroupBacking.updateUsersGroups}" update="userTable userMessages" />
<p:dataTable id="userTable" ...>
<p:ajax event="rowEdit" oncomplete="updateUsersGroups()" />
...
</p:dataTable>

并删除 RowEditEvent从方法论据。

顺便说一句,而不是重新创建整个 LazyDataModel为了强制重新加载惰性数据模型,您也可以只获取 DataTable 的句柄。组件实例以某种方式(作为方法参数?)并调用 loadLazyData()方法就可以了。例如。通过 binding :
<p:remoteCommand name="updateUsersGroups" action="#{userGroupBacking.updateUsersGroups(userTable)}" update="userTable userMessages" />
<p:dataTable id="userTable" binding="#{userTable}" ...>
<p:ajax event="rowEdit" oncomplete="updateUsersGroups()" />
...
</p:dataTable>


public void updateUsersGroups(DataTable table) {
// ...
table.loadLazyData();
}

关于jsf - 使用 LazyDataModel 的 Primefaces 数据表未更新。似乎没有调用加载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19504070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com