-6ren"> -编辑单元格后,我很难重新渲染 PrimeFaces 数据表。更改一个单元格中的值可能会更改其他单元格中的条目,因此需要刷新整个表格。 这是 JSF 页面: -6ren">
gpt4 book ai didi

jsf - 更新整个

on complete of

转载 作者:行者123 更新时间:2023-12-03 08:33:13 24 4
gpt4 key购买 nike

编辑单元格后,我很难重新渲染 PrimeFaces 数据表。更改一个单元格中的值可能会更改其他单元格中的条目,因此需要刷新整个表格。

这是 JSF 页面:

<h:form id="testForm">
<p:outputPanel id="testContainer">

<p:dataTable id="testTable" value="#{tableBean.data}" var="entry" editable="true" editMode="cell">

<p:ajax event="cellEdit" listener="#{tableBean.onCellEdit}" update=":testForm:testContainer" />

<p:column headerText="Col1">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{entry.col1}" /></f:facet>
<f:facet name="input"><p:inputText value="#{entry.col1}" /></f:facet>
</p:cellEditor>
</p:column>

<p:column headerText="Col2">
<p:cellEditor>
<f:facet name="output"><h:outputText value="#{entry.col2}" /></f:facet>
<f:facet name="input"><p:inputText value="#{entry.col2}" /></f:facet>
</p:cellEditor>
</p:column>

</p:dataTable>

<p:commandButton id="refreshButton" value="Redisplay" update="testContainer" />

</p:outputPanel>
</h:form>

这是支持bean:
@ManagedBean(name = "tableBean", eager = false)
@ViewScoped
public class TableBean {

public TableBean() {
RowData entry = new RowData("a1", "b1");
entries.add(entry);
entry = new RowData("a2", "b2");
entries.add(entry);
entry = new RowData("a3", "b3");
entries.add(entry);
}

public class RowData {

private String col1;
private String col2;

public RowData(String col1, String col2) {
this.col1 = col1;
this.col2 = col2;
}

public String getCol1() {
return col1;
}

public void setCol1(String col1) {
this.col1 = col1;
}

public String getCol2() {
return col2;
}

public void setCol2(String col2) {
this.col2 = col2;
}
}

private ArrayList<RowData> entries = new ArrayList<RowData>();

public List<RowData> getData() {
return entries;
}

public void onCellEdit(CellEditEvent event) {
entries.get(event.getRowIndex()).setCol1("Dummy Col 1");
entries.get(event.getRowIndex()).setCol2("Dummy Col 2");
}
}

当在 cellEdit AJAX 事件中包含 update=":testForm:testContainer"时,更改单元格值会删除屏幕上的数据表并且只呈现单元格内容(以及按钮)——我不明白为什么会这样。当未指定更新属性时,表格仍保留在屏幕上,事件单元格已更新,但其他单元格均未更新(如预期的那样)。

通过不在 AJAX cellEdit 事件中指定更新属性并在编辑单元格的值后单击重新显示按钮,可以(以非自动方式)实现所需的行为。我怎样才能以自动化的方式实现这一点,为什么更新属性没有按我预期的那样工作?

我正在使用 PrimeFaces 4.0。

最佳答案

rowEditcellEdit事件按设计在表内不会更新/重新渲染当前行以外的任何其他内容,即使在 update 中明确指定时也不会属性。这是 PrimeFaces 有点过分热心地尝试最小化响应大小的结果。这在大多数情况下都有意义,但在您的情况下则不然。值得一份问题报告。

同时,在他们修复此行为之前,您最好的选择是使用 <p:remoteCommand>调用所需的监听器方法并执行表的完整更新。

改写

<p:dataTable ...>
<p:ajax event="cellEdit" listener="#{tableBean.onCellEdit}" update=":testForm:testContainer" />
...
</p:dataTable>


<p:remoteCommand name="onCellEdit" action="#{tableBean.onCellEdit}" update="testContainer" />
<p:dataTable ...>
<p:ajax event="cellEdit" oncomplete="onCellEdit()" />
...
</p:dataTable>

关于jsf - 更新整个 <p :dataTable> on complete of <p:ajax event ="cellEdit">,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19548838/

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