CRUD操作用の動的列を含む柔軟なテーブルを考案しようとしています。p:columns コンポーネントを使用して動的な列を作成していますが、それらの列を更新しようとしても値が変わりません。
<h:form id="form">
<p:dataTable id="dataTable"
var="item"
value="#{tableEditorController.items}"
editable="true"
paginator="true"
rows="10"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="5,10,15">
<p:ajax event="rowEdit" listener="#{tableEditorController.onEdit}" />
<f:facet name="header">
#{tableEditorController.tableName}
</f:facet>
<p:columns value="#{tableEditorController.columns}"
var="column"
columnIndexVar="colIndex">
<f:facet name="header">#{column.header}</f:facet>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{item[column.property]}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{item[column.property]}" style="width:100%"/>
</f:facet>
</p:cellEditor>
</p:columns>
<p:column>
<f:facet name="header">test</f:facet>
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{item['activityName']}" />
</f:facet>
<f:facet name="input">
<p:inputText value="#{item['activityName']}" style="width:100%"/>
</f:facet>
</p:cellEditor>
</p:column>
<p:column headerText="Edit" style="width:6%">
<p:rowEditor />
</p:column>
</p:dataTable>
</h:form>
「編集」列のリンクをクリックすると、選択した行のすべてのセルがテキスト入力フィールドに変わります。「テスト」列の値を編集して保存すると、期待どおりに適切に保存されます。しかし、p:columns タグで生成された列の入力フィールドを使用して値を編集し、保存しようとすると、変更が保存されません。
Chrome Tools で http リクエストを監視しました。リクエストには、すべての場合に変更された値が含まれています。
コードをデバッガーで実行したところ、RowEditEvent には最初のケースでは新しいデータが含まれ、2 番目のケースでは変更されていないデータ オブジェクトが含まれています。
私は自分の間違いに気付かず、疑わしいのは角括弧の表記だけです。
「テスト」列で使用して角括弧表記を確認しましたが、正常に動作します。
JSF 2.1.3 と Primefaces 3.3 を使用しています
コントローラークラスは次のとおりです。
@ManagedBean
@RequestScoped
public class TableEditorController {
private static List activityList;
static{
activityList = new ArrayList();
ActivityType at = new ActivityTypeImpl();
at.setActivityId(1L);
at.setActivityName("FirstActivity");
activityList.add(at);
at = new ActivityTypeImpl();
at.setActivityId(2L);
at.setActivityName("Second Activity");
activityList.add(at);
}
public void onEdit(RowEditEvent event){
FacesMessage msg = new FacesMessage("Row Edited");
msg.setDetail(event.toString() + event.getObject());
FacesContext.getCurrentInstance().addMessage(null, msg);
}
public void delete(Object id){
}
public List getItems(){
return activityList;
}
public String getTableName(){
return "Name of the Table";
}
public List<ColumnModel> getColumns(){
ColumnModel m1 = new ColumnModel("ID", "activityId");
ColumnModel m2 = new ColumnModel("Activity", "activityName");
return Arrays.asList(m1, m2);
}
}
提案やアイデアをいただければ幸いです。