我有一个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无法正常工作。
有没有人知道可能导致这种行为的原因,以及我应该怎么做才能纠正它?
答案 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>