我有h:dataTable
。我想有条件地渲染一行如下:
<h:dataTable value="#{myController.entities}" var="entity">
<h:column rendered="#{entity.selected}">
<f:facet name="header">
<h:outputText value="header" />
</f:facet>
<h:outputText value="#{entity.name}" />
</h:column>
</h:dataTable>
在我的控制器中有变量List <Entity>
实体,它们具有getter和setter。
Entity
类包含两个变量:boolean selected
和String name
及其getter和setter。
当#{entity.selected}
为false时,该行将被隐藏。如果#{entity.selected}
为真,则显示行但不带标题。当我不在列上使用呈现的属性时,我的标题变得可见。
此问题与p:column header facet is not shown when rendered attribute is used on p:column
类似但是给出的解决方案都不适合我,而且我没有使用primefaces。
有人可以帮我这个吗?我刚接触JSF,这个错误可能是愚蠢的,并且很容易修复,但请帮我解决。感谢。
Iam发布了我在尝试上述代码时获得的输出。
**Header**
name 0
name 1
name 2
name 3
name 4
此输出显示仅使用<h:column>
的数据表而不尝试有条件地呈现它。可以看到标题。
现在我使用条件渲染时:
name 1
name 3
在此输出中,Iam尝试使用条件渲染<h:column rendered="#{entity.selected}">
。正如您所看到的那样,对于“名称0”,“名称3”和“名称5”,#{entity.selected}
为假,因此无法呈现。
这正是我需要的,但只有在标题显示时才会显示。
我想在#{entity.selected}
值为false的地方隐藏行。还显示列标题。这有可能吗?
答案 0 :(得分:4)
您需要将rendered
条件放在单元格上,而不是列。
<h:dataTable value="#{myController.entities}" var="entity">
<h:column>
<f:facet name="header">
<h:outputText value="header" />
</f:facet>
<h:outputText value="#{entity.name}" rendered="#{entity.selected}" />
</h:column>
</h:dataTable>
或者,如果您有多个组件或代表单元格内容的纯文本,请将其包含在<h:panelGroup>
或<ui:fragment>
中。
<h:dataTable value="#{myController.entities}" var="entity">
<h:column>
<f:facet name="header">
header
</f:facet>
<h:panelGroup rendered="#{entity.selected}">
Blah blah #{entity.name} blah blah
</h:panelGroup>
</h:column>
</h:dataTable>
(注意:您并非在所有地方都需要h:outputText
,另请参阅Is it suggested to use h:outputText for everything?)
如果需要,请在桌面上应用以下CSS以隐藏空单元格,以防您应用例如:表格单元格上的边框或bgcolors:
table {
empty-cells: hide;
}
完全不同的替代方案是提供一个新模型,其中只包含 所需的实体:
<h:dataTable value="#{myController.selectedEntities}" var="entity">
<h:column>
<f:facet name="header">
header
</f:facet>
#{entity.name}
</h:column>
</h:dataTable>
答案 1 :(得分:-2)
而不是
...
<f:facet name="header">
<h:outputText value="header" />
</f:facet>
...
尝试简单
...
<f:facet name="header">Header</f:facet>
...