我正在使用JSF 2.1和ICEFaces 2,我有一个类似的标签集:
<ace:tabSet clientSide="true">
<ace:tabPane>
<f:facet name="label">My First Tab</f:facet>
<h:outputText value="One"></h:outputText>
</ace:tabPane>
<ace:tabPane>
<f:facet name="label">Second Tab</f:facet>
<h:outputText value="Two"></h:outputText>
</ace:tabPane>
<ace:tabPane>
<f:facet name="label">Third Tab</f:facet>
<h:outputText value="Third"></h:outputText>
</ace:tabPane>
</ace:tabSet>
我想基于列表动态生成它们,而不是对tabPanes进行硬编码。我如何通过标准JSF或ICEFaces组件实现这一目标?
我尝试使用<ui:repeat>
,但它不起作用:
<ui:repeat var="o" value="#{bean.myList}" varStatus="status">
<ace:tabPane>
<f:facet name="label">#{o.name}</f:facet>
<h:selectManyCheckbox value="#{o.valuesArray}" layout="pageDirection">
<f:selectItems value="#{o.checkboxes}" />
</h:selectManyCheckbox>
</ace:tabPane>
</ui:repeat>
答案 0 :(得分:3)
我不会做ICEFaces,但你会遇到RichFaces与<rich:tab>
基本上the same problem。由于不存在假设的<rich:tabs>
(如<rich:columns>
,它将是<rich:column>
/ <h:column>
的动态变体),因此必须使用视图构建时JSTL {{ 1}}标记用这些标记准备JSF视图。您可以在ICEFaces页面上应用相同的内容:
<c:forEach>
请注意,只有<ace:tabSet clientSide="true">
<c:forEach items="#{bean.tabs}" var="tab">
<ace:tabPane>
<f:facet name="label">#{tab.label}</f:facet>
<h:outputText value="#{tab.name}"></h:outputText>
</ace:tabPane>
</c:forEach>
</ace:tabSet>
不是真正的托管bean,而且表达式依赖于对另一个JSF组件的评估,例如#{bean}
,这只会失败。
<h:dataTable var="bean">
无效,因为它是渲染时标记。在构建JSF组件树之前,它不会动态生成多个JSF组件。
答案 1 :(得分:0)
我想你可以这样写:
<ice:panelTabSet var="tab" value="#{mainTabsTempl.tabs}">
<ice:panelTab label="#{tab.label}">
body
</ice:panelTab>
</ice:panelTabSet>
它不是tabSet
标签,但具有相同的功能。