如何动态生成ace:tabPane组件?

时间:2011-10-25 11:00:30

标签: jsf jsf-2 icefaces

我正在使用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>

2 个答案:

答案 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标签,但具有相同的功能。