我正在使用jsf Mojarra 2.2.7,Java 8,Primefaces 5.1和netbeans 8.0.2
我有一个属性为Event
的课程List<GameRecord> gameRecordList
。 GameRecord
包括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>
,但无论哪种方式,页面都显示为空白,此处应显示此数据。
这是否有意义或是否有理由需要完整寻址才能使其正常工作?
答案 0 :(得分:6)
<c:forEach>
应与value="#{item.gamesEntered}"
合作,而不是完整字符串,但不是。
JSTL标记在视图构建期间运行,构建JSF组件树。 JSF组件在视图渲染时运行,生成HTML输出。因此,在<c:forEach>
运行的那一刻,<p:dataTable>
尚未运行且其var
无处可用,并将评估为null
。请注意,这同样适用于rowIndexVar
,它将评估为0
(int
的默认值)。
我已尝试过
<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>