有条件地呈现列时,列标题不可见

时间:2014-08-26 13:31:02

标签: jsf datatable

我有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 selectedString 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的地方隐藏。还显示列标题。这有可能吗?

2 个答案:

答案 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>
...