primefaces tabView different tab content with dynamic tabs

核能气质少年 提交于 2019-12-02 10:08:12

This works:

<p:tabView id="searchTabViewId" styleClass="searchTabView" activeIndex="#{searchBL.activeTabIndex}">

  <!-- do the iteration over the search instances NOT in the tabView because this will not work with ui:include -->
  <c:forEach items="#{searchBL.searchInstances}" var="curSearch">

     <p:tab closable="#{curSearch.isCloseable()}">

        <f:facet name="title">
           <p:graphicImage library="images" name="search_tab.png" height="16" styleClass="tabImage"
              rendered="#{not curSearch.isCloseable()}" />
           <h:outputText value="#{curSearch.title}" />
        </f:facet>

        <!-- do not use 2 ui:includes here, the dynamic must be in the src attribute to get it work -->
        <ui:include
           src="#{curSearch.closeable ? '/sections/search/searchInstanceTab.xhtml' : '/sections/search/firstSearchTab.xhtml'}">
           <ui:param name="curSearch" value="#{curSearch}" />
        </ui:include>

     </p:tab>

  </c:forEach>

I had the same problem, only solution i found is wrap include in other component and clamp with render which one is displayed. For initial load if you have ids depending on content you will need to set id prefix so that it does not allow empty id fields:

<p:tabView id="tabsView" dynamic="true" cache="true"
           value="#{TabViewController.tabView.openedTabs}" var="tabDefinition" activeIndex="#{TabViewController.tabView.activeIndex}">
    <p:ajax event="tabClose" listener="#{TabViewController.onCloseTab}" update="tabsView"/>
    <p:ajax event="tabChange" update="tabsView"/>
    <p:tab id="tab#{tabDefinition.id}" title="#{tabDefinition.title}" closable="true" action="">
        <f:facet name="title">
            <h:outputText value="#{tabDefinition.title}"/>
        </f:facet>
        <p:outputPanel style="display:block" rendered="#{'dataTable'.equals(tabDefinition.type)}">
            <ui:include src="dataTable.xhtml">
                <ui:param name="dataTableName" value="#{tabDefinition.contentName}"/>
            </ui:include>
        </p:outputPanel>
        <p:outputPanel style="display:block" rendered="#{'form'.equals(tabDefinition.type)}">
            <ui:include src="form.xhtml">
                <ui:param name="formId" value="#{tabDefinition.id}"/>
                <ui:param name="formName" value="#{tabDefinition.contentName}"/>
            </ui:include>
        </p:outputPanel>
    </p:tab>
</p:tabView>
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!