Primefaces:动作(-Listener)完成后更新
Primefaces: Updating after action(-Listener) completed
我希望我的 p:datatable 在删除条目后变为 update/refresh。 DB端删除成功。手动刷新后,条目消失了。但是我无法让p:datatable自动刷新
我已经尝试过 ajax 命令,检查执行顺序和不同的更新目标。
p:datatable 来自 index.xhtml:
<h:form id="form">
<p:dataTable id="table" var="row" value="#{mitarbeiterView.mitarbeiter}">
<p:column headerText="ID">
<h:outputText value="#{row.employeeId}" />
</p:column>
<p:column headerText="Name">
<h:outputText value="#{row.lastname}" />
</p:column>
<p:column headerText="Löschen">
<p:commandLink update=":form, :form:table" action="#{mitarbeiterService.deleteEmployee(mitarbeiterView.selectedEmployee)}"
title="Löschen" styleClass="ui-icon pi pi-trash">
<f:setPropertyActionListener value="#{row}" target="#{mitarbeiterView.selectedEmployee}" />
</p:commandLink>
</p:column>
</p:dataTable>
</p:panelGrid>
</h:form>
MitarbeiterView.java:
@Named(value = "mitarbeiterView")
@ViewScoped
public class MitarbeiterView implements Serializable {
private static final long serialVersionUID = 7924178697538784022L;
private List<Employee> mitarbeiter;
private Employee selectedEmployee;
@PostConstruct
public void init() {
SessionConfig.initSession();
mitarbeiter = Queries.findAllEmployees();
}
public List<Employee> getMitarbeiter() {
return mitarbeiter;
}
public void setMitarbeiter(List<Employee> mitarbeiter) {
this.mitarbeiter = mitarbeiter;
}
public void setSelectedEmployee(Employee selectedEmployee) {
this.selectedEmployee = selectedEmployee;
}
public Employee getSelectedEmployee() {
return selectedEmployee;
}
}
MitarbeiterService.java```
@Named(value = "mitarbeiterService")
@ViewScoped
public class MitarbeiterService implements Serializable {
private static final long serialVersionUID = -445070832052637147L;
public void deleteEmployee(Employee mitarbeiter) {
if (mitarbeiter != null) {
ManageEmployees.deleteEmployee(mitarbeiter.getEmployeeId());
}
}
p:datatable 应该会自行刷新。删除的员工应该没有了。
我认为您必须从 List<Employee>
(mitarbeiter
) 中删除 selectedEmployee
。
您可以在删除后在后端再次执行查询,或者只是从列表中删除 selectedEmployee
。您必须在方法 deleteEmployee
中执行此操作
我认为 deleteEmployee
必须在 MitarbeiterView
ManageBean 中。如果将 deleteEmployee
放在 MitarbeiterView
ManageBean 中,您可以这样做:
public void deleteEmployee(Employee mitarbeiter) {
if (mitarbeiter != null) {
ManageEmployees.deleteEmployee(mitarbeiter.getEmployeeId());
mitarbeiter = Queries.findAllEmployees();
}
}
好的,新答案。 comment-editor 看起来很垃圾。
谢谢,这成功了。删除方法现在看起来像这样:
public void deleteEmployee(Employee mitarbeiter, MitarbeiterView view) {
if (mitarbeiter != null) {
ManageEmployees.deleteEmployee(mitarbeiter.getEmployeeId());
view.setMitarbeiter(Queries.findAllEmployees());
}
}
和p:column
<p:column headerText="Löschen">
<p:commandLink update=":form, :form:table" action="#{mitarbeiterService.deleteEmployee(row, mitarbeiterView)}"
title="Löschen" styleClass="ui-icon pi pi-trash"/>
</p:column>
忘了我不在实体上工作。当 Life-long 后端开发人员必须设计前端时发生 ;)
更新:
如果我添加一个 init 方法,将 MitarbeiterView 绑定到一个静态变量,代码会看起来更好。传递给方法只是又脏又丑。
我希望我的 p:datatable 在删除条目后变为 update/refresh。 DB端删除成功。手动刷新后,条目消失了。但是我无法让p:datatable自动刷新
我已经尝试过 ajax 命令,检查执行顺序和不同的更新目标。
p:datatable 来自 index.xhtml:
<h:form id="form">
<p:dataTable id="table" var="row" value="#{mitarbeiterView.mitarbeiter}">
<p:column headerText="ID">
<h:outputText value="#{row.employeeId}" />
</p:column>
<p:column headerText="Name">
<h:outputText value="#{row.lastname}" />
</p:column>
<p:column headerText="Löschen">
<p:commandLink update=":form, :form:table" action="#{mitarbeiterService.deleteEmployee(mitarbeiterView.selectedEmployee)}"
title="Löschen" styleClass="ui-icon pi pi-trash">
<f:setPropertyActionListener value="#{row}" target="#{mitarbeiterView.selectedEmployee}" />
</p:commandLink>
</p:column>
</p:dataTable>
</p:panelGrid>
</h:form>
MitarbeiterView.java:
@Named(value = "mitarbeiterView")
@ViewScoped
public class MitarbeiterView implements Serializable {
private static final long serialVersionUID = 7924178697538784022L;
private List<Employee> mitarbeiter;
private Employee selectedEmployee;
@PostConstruct
public void init() {
SessionConfig.initSession();
mitarbeiter = Queries.findAllEmployees();
}
public List<Employee> getMitarbeiter() {
return mitarbeiter;
}
public void setMitarbeiter(List<Employee> mitarbeiter) {
this.mitarbeiter = mitarbeiter;
}
public void setSelectedEmployee(Employee selectedEmployee) {
this.selectedEmployee = selectedEmployee;
}
public Employee getSelectedEmployee() {
return selectedEmployee;
}
}
MitarbeiterService.java```
@Named(value = "mitarbeiterService")
@ViewScoped
public class MitarbeiterService implements Serializable {
private static final long serialVersionUID = -445070832052637147L;
public void deleteEmployee(Employee mitarbeiter) {
if (mitarbeiter != null) {
ManageEmployees.deleteEmployee(mitarbeiter.getEmployeeId());
}
}
p:datatable 应该会自行刷新。删除的员工应该没有了。
我认为您必须从 List<Employee>
(mitarbeiter
) 中删除 selectedEmployee
。
您可以在删除后在后端再次执行查询,或者只是从列表中删除 selectedEmployee
。您必须在方法 deleteEmployee
我认为 deleteEmployee
必须在 MitarbeiterView
ManageBean 中。如果将 deleteEmployee
放在 MitarbeiterView
ManageBean 中,您可以这样做:
public void deleteEmployee(Employee mitarbeiter) {
if (mitarbeiter != null) {
ManageEmployees.deleteEmployee(mitarbeiter.getEmployeeId());
mitarbeiter = Queries.findAllEmployees();
}
}
好的,新答案。 comment-editor 看起来很垃圾。
谢谢,这成功了。删除方法现在看起来像这样:
public void deleteEmployee(Employee mitarbeiter, MitarbeiterView view) {
if (mitarbeiter != null) {
ManageEmployees.deleteEmployee(mitarbeiter.getEmployeeId());
view.setMitarbeiter(Queries.findAllEmployees());
}
}
和p:column
<p:column headerText="Löschen">
<p:commandLink update=":form, :form:table" action="#{mitarbeiterService.deleteEmployee(row, mitarbeiterView)}"
title="Löschen" styleClass="ui-icon pi pi-trash"/>
</p:column>
忘了我不在实体上工作。当 Life-long 后端开发人员必须设计前端时发生 ;)
更新: 如果我添加一个 init 方法,将 MitarbeiterView 绑定到一个静态变量,代码会看起来更好。传递给方法只是又脏又丑。