我尝试在不同的标签页中使用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
。
答案 0 :(得分:6)
<ui:include>
在视图构建期间运行(当XHTML转换为JSF组件树时)。 <p:tabView>
在视图渲染时运行(当JSF组件树需要生成HTML时)。
因此,<p:tabView var>
运行时<ui:include>
不可用。此问题在此答案中详细说明:JSTL in JSF2 Facelets... makes sense?(<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
。
答案 1 :(得分:0)
上述社区的答案不适用于动态tabView
message
如果我对选项卡使用dynamic =“ true”和c:foreach,则当我添加或删除选项卡时,请更新@ tabViewId,tabview将重新加载“现有选项卡的所有内容” =>这不是属性“动态”的工作,这不是偷懒。
我的项目对此有疑问,我不得不自定义TabViewRenderer的encodeEnd方法并执行其他操作,但这并不简单。
我想知道是否有一种方法可以在渲染时包含XHTML模板?