为什么<c:forEach>或<ui:repeat>不能访问<p:dataTable var>?

4
我正在使用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>,但无论哪种方式都无法在页面上显示此数据。这是否说得通?或者说必须要使用完整的地址才能使其正常工作?

这个完整的字符串在哪里?我没看到它。而且你不能在jstl标签中使用jsf组件的变量(rowIndex)。请参见http://stackoverflow.com/questions/4154841/mixing-jsf-tags-with-jstl-tags-gives-strange-results。 - Kukeltje
1个回答

8

<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>,它基本上是扩展自UIColumn类的<ui:repeat>。但是,在这里,它的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>

另请参见:


非常有道理。谢谢! - GolfAddict
我需要在p:columns中添加必需的var属性,但是通过您的建议,我已经使其工作。然而,我不确定我是否正确理解了这一点,或者它只是欺骗了视图渲染解析器。p:columns值中的[0]引用不是行引用,而是下一行中的rowIndex。我只是利用了您对当前过程的详细了解,还是这是可持续的方法? - GolfAddict
这是因为列只能在每个表格上定义,而不能在每行上定义。当创建列时,p:dataTable尚未迭代,而rowIndex默认为0。可以将其视为c:forEach方法的实现方式。下面的“另请参阅”链接将进一步阐述并提供其他示例。现在,您或许也更好地理解了我在ui:repeat中所说的“你很幸运”的话。 - BalusC
好的。顺便问一下,考虑过使用<p:column><p:selectManyCheckbox>吗?这可能只需要在模型中进行更改(不是布尔值,而是真实实体),但最终应该会得到更直观的视图(如果您实际上不想要布尔值,而只想要集合/外键关系,则模型也可能如此,尤其是如果您实际上正在手动映射布尔值和现有关系)。 - BalusC
我对它很熟悉,但从未使用过。我的假设是它无法处理我所需的标题和格式,但我会调查并更改,如果它能提供更好的答案。再次感谢您的所有帮助! - GolfAddict
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接