4

異なるタブで ui:include タグを使用して、複数のソース ページ パスを含めようとしました。問題は、ソースページのパスを静的なものとして指定した場合、ページが表示されることを意味しますが、バッキング Bean からのソースページのパスを指定すると、ページが含まれないことを意味します。

これが私のコードです

template.xhtml:

    <p:layoutUnit position="center" id="layoutCenter">
                <h:form id="tempFormId">
                    <p:tabView value="#{multiTabBean.tabsList}" var="useCase"
                        activeIndex="#{multiTabBean.activeTabIndex}">
                        <p:tab title="#{useCase.title}" closable="true">
                            <f:subview>
                                <h:panelGroup id="mainTempPanelGroupId" layout="block">
                                    <ui:include src="#{useCase.path}" />
                                </h:panelGroup>

                            </f:subview>
                        </p:tab>
                    </p:tabView>
                </h:form>
            </p:layoutUnit>

豆:

public String menuAction() {                    
    menuBtnRendered = true;
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    selectedModuleViewId = externalContext.getRequestParameterMap().get(
            "moduleViewId");

    tabsList.add(new Tab(getTabId(selectedModuleViewId),
                selectedModuleViewId, getModulePath(selectedModuleViewId)));        

    return null;
}

を使用して@ViewScopedいます。

4

2 に答える 2

9

<ui:include>ビューのビルド時 (XHTML が JSF コンポーネント ツリーに変換されるとき) に実行されます。<p:tabView>ビューのレンダリング時 (JSF コンポーネント ツリーが HTML を生成する必要があるとき) に実行されます。

そのため、実行<p:tabView var>時には使用できません<ui:include>。この問題は、この回答で詳しく説明されています: JSF2 Facelets の JSTL... は理にかなっていますか? (<ui:include>はタグハンドラであるため、JSTL タグと同じライフサイクルを持ちます)。

の代わりにを使用<c:forEach>して を生成することで、これをある程度解決できます。<p:tab><p:tabView value>

<p:tabView activeIndex="#{multiTabBean.activeTabIndex}">
    <c:forEach items="#{multiTabBean.tabsList}" var="useCase" varStatus="loop">
        <p:tab title="#{useCase.title}" closable="true">
            <f:subview id="tab_#{loop.index}">
                <h:panelGroup id="mainTempPanelGroupId" layout="block">
                    <ui:include src="#{useCase.path}" />
                </h:panelGroup>
            </f:subview>
        </p:tab>
    </c:forEach>
</p:tabView>

ところで、最初の試行で何らかの形で使用<f:subview>したことは興味深いことですが (すでに によって考慮されています<p:tabView var>)、ここでは実際に役立ちます (NamingContainerタブ コンテンツの周りに新しい を作成します)。

于 2013-11-21T08:50:15.447 に答える