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

时间:2011-02-02 03:28:31

标签: jsf

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

<h:dataTable value='#{sessionBean.items}' var='item'>
    <h:column rendered='#{item.visible}'>
        <h:outputText value='#{item.description}'/>
    </h:column>
</h:dataTable>

我的问题是,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>

也就是说,在这种情况下,渲染所有项目,并且为每个项目成功输出文本“visible = true”或“visible = false”。列rendered列中的表示getter无法正常工作。

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

1 个答案:

答案 0 :(得分:5)

相同列中 all 的表列(读取:<td>元素,因此适用于所有行)无法按行进行渲染。这不是JSF的限制,而是HTML限制。问问自己,HTML最终应该如何?浏览器应该如何处理每行中缺少<td>个元素的所有元素?没错,根本就没有意义:)


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

<h:column>
    <h:outputText value="#{item.description}" rendered="#{item.visible}"/>
</h:column>

如果实际上想要完全隐藏整个列,请将其设为基于bean的渲染:

<h:column rendered="#{sessionBean.visible}">
    <h:outputText value="#{item.description}"/>
</h:column>