我有一个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吸气剂是行不通的属性.
有没有人知道可能导致这种行为的原因,以及我应该怎么做才能纠正它?
表列(读取:所有在同一列中的<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)
| 归档时间: |
|
| 查看次数: |
8849 次 |
| 最近记录: |