【问题标题】:Why can <c:forEach> or <ui:repeat> not access <p:dataTable var>?为什么 <c:forEach> 或 <ui:repeat> 不能访问 <p:dataTable var>?
【发布时间】:2015-05-15 06:34:51
【问题描述】:

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

我有一个类Event 有一个属性List&lt;GameRecord&gt; gameRecordListGameRecord 包括List&lt;Boolean&gt; 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>

&lt;c:forEach&gt; 应该与value="#{item.gamesEntered}" 一起使用,而不是与完整的字符串一起使用,但事实并非如此。我已经尝试过&lt;ui:repeat&gt;,但无论哪种方式,页面都会出现空白,而这些数据应该出现在哪里。

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

【问题讨论】:

标签: jsf primefaces foreach datatable jstl


【解决方案1】:

&lt;c:forEach&gt; 应该与 value="#{item.gamesEntered}" 一起使用,而不是完整的字符串,但它不是。

JSTL 标签在视图构建期间运行,构建 JSF 组件树。 JSF 组件在视图呈现期间运行,产生 HTML 输出。所以目前&lt;c:forEach&gt; 运行,&lt;p:dataTable&gt; 还没有运行,它的var 无处可用,并将评估为null。请注意,这同样适用于 rowIndexVar,其计算结果为 0int 的默认值)。

另见


我已经尝试过&lt;ui:repeat&gt;,但无论哪种方式,页面都会出现空白,而这些数据应该出现在这个地方。

UIData 组件只能接受 UIColumn 子级。 &lt;ui:repeat&gt; 不是这样的。 &lt;c:forEach&gt; 之所以有效,是因为它基本上为数据表生成了一堆物理 &lt;p:column&gt; 组件。你很幸运,每个项目的 gamesEntered 数量显然与第一个项目相同,否则这也会失败。

另见:


顺便说一句,您需要&lt;p:columns&gt;,它基本上是从UIColumn 类扩展而来的&lt;ui:repeat&gt;。但同样在这里,它的value 不能在每行的基础上设置,只能在每表的基础上设置。 rowIndexVar&lt;p:columns value&gt; 中不可用,并且无论如何都会评估为 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>

另见:

【讨论】:

  • 非常有意义。谢谢!
  • 我已经进行了更改,并且显示效果很好,但是当用户进行更改时属性不会更新。作为一个列表,我没有索引的设置器,除了发布代码以找出我做错了什么之外,我不确定如何调试。我应该在这里发布最终代码还是打开一个新问题?
  • 对不起,我错过了评论,我已经更新了答案。
  • 我需要将强制 var 属性添加到 p:columns 但我按照你的建议让它工作了。但是我不确定我是否正确理解这一点,或者它是否只是在愚弄视图渲染解析器。 p:columns 值中的 [0] 引用不是行引用,但下一行中的 rowIndex 是。我只是在逃避您对当前流程的详细了解,还是这是一种可持续的方法?
  • 这是因为列是(并且只能)基于每个表定义的,而不是基于每行的。在创建列时, p:dataTable 尚未迭代,并且 rowIndex 无论如何都会默认为 0。把它想象成 c:forEach 方法。下面的“另请参阅”链接将进一步详细说明并提供其他示例。你现在也许会更好地理解我在 ui:repeat 中的“你很幸运”这句话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
  • 2011-04-02
  • 2014-02-04
  • 2012-10-09
  • 2011-03-30
  • 2021-07-14
  • 1970-01-01
相关资源
最近更新 更多