2014-04-24 34 views
2

我在h:dataTable標記中有ui:repeat問題。我有一個名稱爲field ant的數據集合。所以我通過索引來匹配它們。當我加載頁面時,引發異常OutOfBoundsException。但是當我把filingCabinetManagerBean.filingCabinet.schema.fields.indexOf(schemaField)放在ui:repeat之外時,它顯示正確的索引。所以我試圖分裂它,並宣佈ui:paramc:set作爲變量,但同樣的問題。 cardData actualCard的屬性不爲空,也不爲空,它有7個項目,我已經調試過它。那麼你有什麼想法可能是什麼問題?ui:重複不工作h:dataTable

PS:當我更改ui:repeath:dataTable時,它正在工作。最重要的是,在另一個JSF頁面上使用相同的構造,並且它正在工作,只有一個區別 - 我從卡中獲取cardData,該卡在一個外部數據表中引用,因此它不是Bean(dot)屬性等,但只有variable(dot)等等。

任何想法?感謝您的幫助。 :)

<p:panel header="#{fileUploadBean.actualCard.id}"> 

     <h:dataTable value="#{filingCabinetManagerBean.filingCabinet.schema.fields}" var="schemaField" style="vertical-align: top"> 

      <h:column><h:outputText value="#{schemaField.fieldTitle}:" style="font-size: 20px;font-weight: bold"/></h:column> 
      <h:column> 
       <ul> 
        <ui:repeat value="#{fileUploadBean.actualCard.cardData.get(filingCabinetManagerBean.filingCabinet.schema.fields.indexOf(schemaField)).data}" var="data"> 
         <li><h:outputText value="#{data.string}"/></li> 
        </ui:repeat> 
       </ul>  
      </h:column> 
     </h:dataTable> 

+0

哪個JSF IMPL /版本?試過最新? 在Mojarra有很多錯誤,其中大部分應該已經被當前的最新版本2.2.12所淘汰。目前的答案只顯示瞭解決方法。儘管如此,在getter中做業務邏輯是一個壞主意。你最好重做你的控制器以預先填充視圖期望的模型,而不是讓視圖通過getter來填充模型(這顯然是低效的)。另見a.o. http://stackoverflow.com/questions/2090033/why-jsf-calls-getters-multiple-times – BalusC

回答

0

<ui:repeat>因爲<ui:repeat>value使用<h:dataTable>var取出了不裏<h:dataTable>工作。

對於模糊的原因,正確<h:dataTable>迭代上最後一次與null值列表中的所有對象。最後一次迭代打破<ui:repeat>

解決方法是在獲取ui:repeatvalue的同時處理此問題。舉例來說,如果你有這樣的:

<h:dataTable value="#{someBean.parentObjList}" var="obj"> 
    <h:column> 
    <ui:repeat value="#{someBean.getChildren(obj)" var="child" > 
     ... 
    </ui:repeat> 
    </h:column> 
</h:dataTable> 

和Controller:

public List<ChildObj> getChildren(ParentObj obj) { 
    return parentObjService.findAllFor(obj); 
} 

然後你需要通過將其替換:

public List<ChildObj> getChildren(ParentObj obj) { 
    if (obj == null) 
    return new ArrayList<ChildObj>(); // return empty ArrayList to avoid crashing 
    else 
    return parentObjService.findAllFor(obj); 
}