1

我对 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>

知道如何解决吗?

提前致谢。

问候。

4

1 回答 1

2

只需停止在 getter 方法中执行业务逻辑即可。Getter 方法应该只返回已经准备好的数据。

改为在(后)构造函数或操作(侦听器)方法中执行业务逻辑。

也可以看看:

于 2013-07-04T14:55:56.230 回答