Jsf 是否可以将视图范围的bean创建限制为选项卡视图中的活动选项卡
我的应用程序结构是这样的 template.xhtmlJsf 是否可以将视图范围的bean创建限制为选项卡视图中的活动选项卡,jsf,jsf-2,primefaces,jsf-2.2,view-scope,Jsf,Jsf 2,Primefaces,Jsf 2.2,View Scope,我的应用程序结构是这样的 template.xhtml <html> <h:body> <f:view> <p:layout fullPage="true"> <p:layoutUnit position="center"> <ui:insert name="content"/>
<html>
<h:body>
<f:view>
<p:layout fullPage="true">
<p:layoutUnit position="center">
<ui:insert name="content"/>
</p:layoutUnit>
<p:layoutUnit position="south" size="50" style="bottom:0px;" gutter="0" collapsible="true">
<ui:include src="footer.xhtml"/>
</p:layoutUnit>
</p:layout>
</f:view>
</h:body></html>
<ui:composition template="../templates/template.xhtml">
<ui:define name="content">
<p:tabView id="contentTabView" dynamic="true" cache="false" activeIndex="0">
<p:tab id="tab1" />
<p:tab id="tab2" />
.
.
<p:tab id="tabn" />
</p:tabView>
</ui:define>
</ui:composition>
菜单.xhtml
<html>
<h:body>
<f:view>
<p:layout fullPage="true">
<p:layoutUnit position="center">
<ui:insert name="content"/>
</p:layoutUnit>
<p:layoutUnit position="south" size="50" style="bottom:0px;" gutter="0" collapsible="true">
<ui:include src="footer.xhtml"/>
</p:layoutUnit>
</p:layout>
</f:view>
</h:body></html>
<ui:composition template="../templates/template.xhtml">
<ui:define name="content">
<p:tabView id="contentTabView" dynamic="true" cache="false" activeIndex="0">
<p:tab id="tab1" />
<p:tab id="tab2" />
.
.
<p:tab id="tabn" />
</p:tabView>
</ui:define>
</ui:composition>
.
.
在我的应用程序中只有一个
,它位于模板文件中
因为我在tabView中添加了dynamic=“true”,所以我认为应该只加载tab1,并创建相应的视图范围bean
当我启动我的应用程序时,我观察到每个选项卡的所有视图范围bean都被创建并放入UIViewRoot的viewMap
我的应用程序menu.xhtml
中只有一个视图,这就是为什么没有当我在选项卡之间切换时,视图范围bean被破坏
有没有办法确保只实例化活动选项卡中引用的bean 我做过类似的事情,但结果不同
<h:form id="tabForm">
<p:tabView id="tabView" dynamic="true" cache="false">
<p:tab id="tba1" title="Tab 1">
#{viewMBean1.hello}
</p:tab>
<p:tab id="tab2" title="Tab 2">
#{viewMBean2.hello}
</p:tab>
</p:tabView>
</h:form>
这是控制台在加载页面时显示的内容:
视图MBean1
我注意到,一旦加载,视图bean在更改选项卡时不会从视图范围中删除。这可能是你不想发生的事情。在这种情况下,您可以通过更改侦听器将bean从视图范围中删除
<p:ajax event="tabChange" listener="#{tabViewManager.onTabChange}" process="@this" global="false" />
在TabViewManager上:
public void onTabChange(TabChangeEvent event) {
Map<String, Object> viewMap = FacesContext.getCurrentInstance().getViewRoot().getViewMap();
viewMap.remove("viewMBean1");
viewMap.remove("viewMBean2");
}
public void onTabChange(TabChangeEvent事件){
Map viewMap=FacesContext.getCurrentInstance().getViewRoot().getViewMap();
viewMap.remove(“viewMBean1”);
viewMap.remove(“viewMBean2”);
}
Primefaces的版本是什么?@DanielCamargo Primefaces 3.5我不建议对每个选项卡使用@ViewScoped
,因为整个选项卡集是一个视图的一部分,不是吗?话虽如此,如果希望避免加载每个选项卡的所有信息,可以使用有条件呈现的h:panelGroup
来封装每个选项卡的内容。当切换选项卡时,调用事件侦听器并加载目标选项卡的信息。感谢您的响应。我想到了从视图映射中删除bean的方法,但希望不要创建bean。至少在版本4中,除非您更改到它们的选项卡,否则不会创建bean。不过,我会在3.5版上查看。哦,这是个好消息。我们的团队正在讨论将其升级到4.0版,我在3.5版上测试了相同的代码,效果非常好。可能会发生什么?