我尝试在不同的选项卡中使用 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>
bean:
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
.
<ui:include>
在视图构建时运行(当 XHTML 转换为 JSF 组件树时)。<p:tabView>
在视图渲染期间运行(当 JSF 组件树需要生成 HTML 时)。
So, <p:tabView var>
不可用时<ui:include>
运行。这个问题在这个答案中有详细说明:JSF2 Facelets 中的 JSTL...有意义吗? https://stackoverflow.com/questions/3342984/jstl-in-jsf2-facelets-makes-sense (<ui:include>
是一个标记处理程序,因此具有与 JSTL 标记相同的生命周期)。
您可以使用以下方法在一定程度上解决这个问题<c:forEach>
生产<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
围绕选项卡内容)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)