セルが編集されたら、PrimeFaces Datatableを再レンダリングするのが難しいです。あるセルの値を変更すると、他のセルのエントリが変更される可能性があるため、テーブル全体をリフレッシュする必要があります。ここで<p:ajax event = "cellEdit">完了時に<p:dataTable>全体を更新
は、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");
}
}
= ":TESTFORM:TESTCONTAINER" cellEdit AJAXイベント内、セル値の削除を変更します画面上のデータテーブルは、(ボタンと一緒に)セルの内容だけをレンダリングします - なぜこれが理解できません。更新属性が指定されていない場合、テーブルはアクティブなセルが更新されたまま画面上に残りますが、他のセルは更新されません(期待どおり)。
AJAX cellEditイベント内で更新属性を指定せず、セルの値を編集した後に再表示ボタンをクリックすることで、(非自動化で)目的の動作を実現できます。どのように私はこれを自動化された方法で達成することができますか?なぜ私は期待どおりに更新属性が機能しませんか?
私はPrimeFaces 4.0を使用しています。
update = ":testForm:testTable"によってupdate = ":testForm:testContainer"を変更しようとしましたか? –
試しましたが、現在のセルだけが更新されています。 – Franzl