0

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);
  }

}

提案やアイデアをいただければ幸いです。

4

1 に答える 1