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 工具监控了 http 请求。在每种情况下,请求都包含更改的值。

我在调试器下运行我的代码,并且 RowEditEvent 在第一种情况下包含新数据,在第二种情况下包含未更改的数据对象。

我无法意识到我的错误,我唯一怀疑的是方括号符号。 我在“测试”列中检查了方括号符号,它工作正常。

我使用 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

1

我找到了解决 p:columns 的方法。我用以下代码替换了它。

<c:forEach items="#{tableEditorController.columns}" var="column">
  <p:column>
    <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%" disabled="#{not column.editable}"/>
      </f:facet>
    </p:cellEditor>
  </p:column>
</c:forEach>

它可以工作,但我必须将 JSTL 库添加到项目依赖项中。

于 2013-08-14T11:49:26.957 回答