JSF h:列标记不评估渲染属性

Mac*_*Mac 4 jsf

我有一个JSF数据表,它根据项的布尔属性有条件地显示每个项目,如下所示:

<h:dataTable value='#{sessionBean.items}' var='item'>
    <h:column rendered='#{item.visible}'>
        <h:outputText value='#{item.description}'/>
    </h:column>
</h:dataTable>
Run Code Online (Sandbox Code Playgroud)

我的问题是该rendered属性似乎根本不是指visible我项目中的属性.我已经在属性的getter中添加了一条跟踪消息,并且可以确认getter根本没有被调用.什么让我为难,不过,是以下工作:

<h:dataTable value='#{sessionBean.items}' var='item'>
    <h:column rendered='true'>
        <h:outputText value='visible = #{item.visible}'/>
        <h:outputText value='#{item.description}'/>
    </h:column>
</h:dataTable>
Run Code Online (Sandbox Code Playgroud)

也就是说,在这种情况下,渲染所有项目,并且为每个项目成功输出文本"visible = true"或"visible = false".它是唯一在列rendered吸气剂是行不通的属性.

有没有人知道可能导致这种行为的原因,以及我应该怎么做才能纠正它?

Bal*_*usC 5

表列(读取:所有同一列中的<td>元素,因此适用于所有行)不能以每行为基础进行呈现.这不是JSF的限制,而是HTML限制.问问自己,HTML最终应该如何?浏览器应该对每行所有缺少的元素做什么?没错,根本就没有意义:)<td>


只需将基于行的渲染移动到单元格内容:

<h:column>
    <h:outputText value="#{item.description}" rendered="#{item.visible}"/>
</h:column>
Run Code Online (Sandbox Code Playgroud)

或者如果你真的想完全隐藏整个列,那么使它成为一个基于bean的渲染:

<h:column rendered="#{sessionBean.visible}">
    <h:outputText value="#{item.description}"/>
</h:column>
Run Code Online (Sandbox Code Playgroud)