gpt4 book ai didi

jsf - p :dataTable rowEdit are not available in listener method as they are being overwritten by existing data from database 中的编辑/更新值

转载 作者:行者123 更新时间:2023-12-01 11:35:02 26 4
gpt4 key购买 nike

我正在使用 <p:dataTable> 编辑数据如下所示的行编辑器。

<p:dataTable value="#{bean.users}" var="user" editable="true">
<p:ajax event="rowEdit" listener="#{bean.onRowEdit}" />
<p:ajax event="rowEditCancel" listener="#{bean.onRowEditCancel}" />
<p:column>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{user.firstName}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{user.firstName}" />
</f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>

backing bean 实现如下。

private List<User> users;

@EJB
private UserService userService;

public List<User> getUsers() {
users = userService.list();
return users;
}

当我在 cellEditor 中输入新数据并提交时,它们在监听器方法中不可用。我注意到它们被从数据库调用的数据覆盖。

为什么会发生这种情况,我该如何避免?

最佳答案

您的问题是由在 getter 方法中执行业务逻辑引起的。对数据表的每次迭代都会调用 getter 方法。因此,当 JSF 忙于遍历数据表以在模型中设置提交的值时,getter 调用一次又一次地从 DB 返回一个新列表。

您不应该在 getter 方法中执行业务逻辑。只要您是新手,就最好不要接触 getter(和 setter)方法,而是在其他地方一次性调用方法中执行该工作。

您可能需要一个 @PostConstruct(和一个真正的服务/DAO 类):

private List<User> users;

@EJB
private UserService userService;

@PostConstruct
public void init() {
users = userService.list(); // Call the DB here.
}

public List<User> getUsers() {
return users; // Just return the already-prepared model. Do NOT do anything else here!
}

另见:

关于jsf - p :dataTable rowEdit are not available in listener method as they are being overwritten by existing data from database 中的编辑/更新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27908510/

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