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

<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 不起作用。

有没有人知道什么可能导致这种行为,我应该怎么做来纠正它?

最佳答案

表列(读取:<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>

关于JSF h :column tag not evaluating rendered attribute,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4870512/

10-10 19:27