行编辑器不会更新通过“columns”标记显示的值对象的字段

时间:2013-08-12 14:39:41

标签: jsf primefaces

我尝试为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包含第一种情况下的新数据和第二种情况下未更改的数据对象。

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

我使用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);
  }

}

我将不胜感激任何建议和/或想法。

1 个答案:

答案 0 :(得分: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库添加到项目依赖项中。