【问题标题】:Use ui:repeat inside datatable for all the columns对所有列使用 ui:repeat inside datatable
【发布时间】: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 或 &lt;f:event type="preRenderView" listener="#{...}"/&gt; 中并仅迭代其值吗?

标签: jsf datatable uirepeat


【解决方案1】:

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

改为在 (post)constructor 或 action(listener) 方法中执行业务逻辑。

另见:

【讨论】:

    猜你喜欢
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    相关资源
    最近更新 更多