Jsf 是否可以将视图范围的bean创建限制为选项卡视图中的活动选项卡

Jsf 是否可以将视图范围的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"/>

我的应用程序结构是这样的

template.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>    

菜单.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版上测试了相同的代码,效果非常好。可能会发生什么?