我有一个 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/