为什么<c:foreach>或<ui:repeat>无法访问<p:datatable var =“”>?</p:datatable> </ui:repeat> </c:foreach>

时间:2015-03-12 21:58:29

标签: jsf primefaces foreach datatable jstl

我正在使用jsf Mojarra 2.2.7,Java 8,Primefaces 5.1和netbeans 8.0.2

我有一个属性为Event的课程List<GameRecord> gameRecordListGameRecord包括List<Boolean> gamesEntered和其他属性。我的想法是,我有一个活动中的人员列表,如果他们进入投注或比赛,我将进行配置。

在我的.xhtml文件中

<p:dataTable value="#{events.gameRecordList}" var="item" rowIndexVar="rowIndex">

                <p:column>#{item.field1}</p:column>
                <p:column>#{item.field2}</p:column>

                <c:forEach items="#{events.gameRecordList.get(rowIndex).gamesEntered}" var="game">
                    <p:column>
                        <p:selectBooleanCheckbox value="#{game}"/>
                    </p:column>
                </c:forEach>


            </p:dataTable>

<c:forEach>应该与value="#{item.gamesEntered}"一起使用,而不是完整的字符串,但事实并非如此。我已经尝试了<ui:repeat>,但无论哪种方式,页面都显示为空白,此处应显示此数据。

这是否有意义或是否有理由需要完整寻址才能使其正常工作?

1 个答案:

答案 0 :(得分:6)

  

<c:forEach>应与value="#{item.gamesEntered}"合作,而不是完整字符串,但不是。

JSTL标记在视图构建期间运行,构建JSF组件树。 JSF组件在视图渲染时运行,生成HTML输出。因此,在<c:forEach>运行的那一刻,<p:dataTable>尚未运行且其var无处可用,并将评估为null。请注意,这同样适用于rowIndexVar,它将评估为0int的默认值)。

另见


  

我已尝试过<ui:repeat>,但无论哪种方式,该页面都会显示为空白,此处应显示此数据。

UIData个组件只能接受UIColumn个孩子。 <ui:repeat>不是这样的。 <c:forEach>有效,因为它基本上为数据表生成了一堆物理<p:column>组件。你很幸运,每个项目的gamesEntered明显与第一项相同,否则也会很难。

另见:


顺便说一句,您需要<p:columns>,它基本上是<ui:repeat>,从UIColumn类延伸。但是在这里,它的value不能按行设置,只能基于每个表。 rowIndexVar无法在<p:columns value>中使用,无论如何都会评估为0

<p:dataTable value="#{events.gameRecordList}" var="item" rowIndexVar="rowIndex">
    <p:column>#{item.field1}</p:column>
    <p:column>#{item.field2}</p:column>
    <p:columns value="#{events.gameRecordList[0].gamesEntered}" columnIndexVar="columnIndex">
        <p:selectBooleanCheckbox value="#{events.gameRecordList[rowIndex].gamesEntered[columnIndex]}"/>
    </p:columns>
</p:dataTable>

另见: