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>to 生成<p:tab>s 而不是<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 回答
0

上述社区的答案不适用于动态 tabView

<p:tabView dynamic="true" ...

如果我对选项卡使用 dynamic="true" 和 c:foreach,当我添加或删除选项卡时,请更新 @tabViewId,选项卡视图将重新加载“现有选项卡的所有内容”=> 这不是属性“动态”的方式“工作,不是偷懒。

我的项目有这个问题,我不得不自定义 TabViewRenderer 的方法 encodeEnd 并做其他事情,但这并不简单。

我想知道是否有办法在渲染时包含 XHTML 模板?

于 2019-06-12T13:24:16.870 回答