2011-07-19 129 views
3

是否可以在subTable組件或列中使用forEach循環,在Richfaces 3.3?我需要渲染動態數量的列,但沒有成功。For-each loop in rich:子表

例子:

<rich:dataTable 
     cellpadding="0" cellspacing="0" 
     width="700" border="1" var="serviceCharge" 
     value="#{group.serviceCharges}"> 
    <rich:column colspan="3"> 
     <h:outputText value="#{group.name},#{serviceCharge.code}" /> 
    </rich:column> 
    <rich:subTable var="priceType" value="#{serviceCharge.priceTypes}"> 
     <rich:column colspan="#{group.priceLevels.size}"> 
      <b><h:outputText value="#{priceType.name}" /></b> 
     </rich:column> 
     <rich:subTable var="priceLevelItem" value="#{priceType.priceLevels}"> 
      <rich:column colspan="3"> 
       <h:outputText value="Qty" /> 
      </rich:column> 
      <c:forEach items="#{priceType.priceLevels}" var="priceLevelItem"> 
       <rich:column colspan="3"> 
        <h:outputText value="#{priceLevelItem.id},#{priceLevelItem.qty}" /> 
       </rich:column>        
      </c:forEach> 
     </rich:subTable>             
     <rich:subTable var="priceLevelItem" value="#{priceType.priceLevels}"> 
      <rich:column colspan="3"> 
       <h:outputText value="Amount" /> 
      </rich:column> 
      <rich:column colspan="3"> 
       <h:outputText value="#{priceLevelItem.id},#{priceLevelItem.amount}" /> 
      </rich:column> 
     </rich:subTable>              
    </rich:subTable> 
</rich:dataTable> 

感謝

回答

2

是的,可以。

您可以使用下面的代碼來定義列的列表:

<ui:param name="fields" value="colname1, colname2, colname3"/> 

而在的dataTable柱截面遍歷它:

<rich:dataTable binding="#{backingBean.table}" 
     value="#{backingBean.list}" var="row"> 
    <ui:insert name="extraColumnsFirst"></ui:insert> 
    <f:facet name="header"> 
     <rich:columnGroup> 
      <ui:insert name="extraColumnsHeaderFirst"/> 
      <c:forEach items="${fn:split(fields, ',')}" 
        var="fieldName" varStatus="status"> 
       <rich:column> 
        <h:outputText value="${fieldName}" /> 
       </rich:column> 
      </c:forEach> 
     </rich:columnGroup> 
    </f:facet> 
    <c:forEach items="${fn:split(fields, ',')}" 
      var="fieldName" varStatus="status"> 
     <rich:columnid="column_${fieldName}_${status.index}"> 
      <f:facet name="header"></f:facet> 
      <h:outputText id="${fieldName}_${status.index}" 
        value="${row[fieldName]}"> 
      </h:outputText> 
     </rich:column> 
    </c:forEach> 
    <ui:insert name="extraColumnsLast"> 
    </ui:insert> 
    <f:facet name="footer"> 
     <rich:datascroller id="ds" renderIfSinglePage="false"> 
     </rich:datascroller> 
    </f:facet> 
</rich:dataTable> 
2

是,c:forEach可以用來生成動態列數(對於rich:dataTablerich:subTable)。

在您的例子這是行不通的,因爲你試圖參考VAR priceType未被定義(c:forEachTagHandler所以它試圖評估priveType當樹正在修建; rich:dataTableComponent,它定義了var priveType僅適用於渲染響應)。

欲瞭解更多關於此事的信息,你可以閱讀以下文章:TagHandler vs Component