【发布时间】:2013-07-02 09:41:18
【问题描述】:
我对 h:datatable 和 ui:repeat 有疑问。
我有下一个对象结构:
- 产品
- 子产品类型1
- 子产品类型2
- 子产品类型3
在数据表中,我需要显示产品的信息和子产品之一的信息,例如:
Name Price StartDate EndDate
P1Name 25$ 01/01/13 01/07/13
P2Name 25$ 01/01/13 01/07/13
价格和日期来自 SubproductType2 价格属性。
如果我有这个
<h:dataTable value="#{bundleBean.products}" var="myBundle" >
<ui:param name="currentSubProd" value="#sbaBean.getSubProdOfBundleFilterByCategory(myBundle.id, categoryType.internet)}" />
<h:column>
<f:facet name="header" >Name</f:facet>
#{myBundle.name}
</h:column>
<h:column>
<f:facet name="header" >Price</f:facet>
#{currentSubProd.price}
</h:column>
<h:column>
<f:facet name="header" >StartDate</f:facet>
#{currentSubProd.startDate}
</h:column>
<h:column>
<f:facet name="header" >EndDate</f:facet>
#{currentSubProd.endDate}
</h:column>
</h:dataTable>
它工作得很好,但是每次在 xhtml 文件中调用 #currentSubProd 时它都会调用 bean 方法,在这种情况下是 3 次。因此,如果我在方法中有一些查询,那么数据库会执行 3 次查询。
我意识到,在列中使用 ui:repeat 可以正常工作,但您不能将 ui:repeat 放在列之外,对数据表上的每一列使用 ui:repeat。
像这样(不工作):
<ui:repeat name="currentSubProd" value="#sbaBean.getSubProdOfBundleFilterByCategory(myBundle.id, categoryType.internet)}" >
<h:column>
<f:facet name="header" >Name</f:facet>
#{myBundle.name}
</h:column>
<h:column>
<f:facet name="header" >Price</f:facet>
#{currentSubProd.price}
</h:column>
<h:column>
<f:facet name="header" >StartDate</f:facet>
#{currentSubProd.startDate}
</h:column>
<h:column>
<f:facet name="header" >EndDate</f:facet>
#{currentSubProd.endDate}
</h:column>
</ui:repeat>
</h:dataTable>
知道如何解决这个问题吗?
提前致谢。
问候。
【问题讨论】:
-
它调用了 X 次,因为
ui:param只是一个别名。每次您执行#{currentSubProd.Y}时,它都会评估#{sbaBean.getSubProdOfBundleFilterByCategory(myBundle.id, categoryType.internet).Y}。您不能在显示表格之前填充对象(在其构造函数中、在 beforePhase 或<f:event type="preRenderView" listener="#{...}"/>中并仅迭代其值吗?