Primefaces p:dataTable正在动态p:dialog中处理,即使对话框未显示

Primefaces p:dataTable正在动态p:dialog中处理,即使对话框未显示,primefaces,jsf-2,Primefaces,Jsf 2,我有一个动态对话框 <p:dialog dynamic="true" closeOnEscape="true" id="modalID" modal="true" > <p:outputPanel rendered="#{empty testBean.someArrayList}"> empty </p:outputPanel> </p:di

我有一个动态对话框

<p:dialog
        dynamic="true"
        closeOnEscape="true"
        id="modalID"
        modal="true"
        >
    <p:outputPanel rendered="#{empty testBean.someArrayList}">
        empty
    </p:outputPanel>

</p:dialog>

空的
当我在一个页面上包含这个对话框时,testBean没有初始化——太好了,这就是我想要的。它只有在我显示对话框时才初始化

但是,当我在对话框中包括p:dataTable时:

<p:dialog
dynamic="true"
closeOnEscape="true"
id="modalID"
modal="true"
>
<p:outputPanel>
    <p:dataTable rendered="#{not empty testBean.someArrayList}" value="#{testBean.someArrayList}" var="item">
        <p:column>
            #{item}
        </p:column>
    </p:dataTable>
 </p:outputPanel>

</p:dialog>

#{item}
testBean正在初始化,并对支持bean调用testBean.getSomeArrayList()。 我已经读到ui:includes是这样的(参见),但是为什么p:dataTable是这样的呢?顺便说一句,在p:dataTable周围放置渲染也不能解决问题

我有哪些选项不需要立即初始化testBean? 我可以使用c:if,但根据我的经验,当混合使用JSTL和JSF时,会得到奇怪的结果。我通常只使用它来排除不会呈现的内容(即使在一些ajax请求之后)。当我以前在ajax中使用它时,它确实起到了一定的作用,但可能会导致意想不到的问题

我可以看到的另一个选项是将ui:include与动态src一起使用

<p:dialog
dynamic="true"
closeOnEscape="true"
id="modalID"
modal="true"
>
<p:outputPanel id="updateMeWhenOpeningModal">
    <ui:insert src="#{dialogManager.testBeanSrc}"/>
</p:outputPanel>

</p:dialog>

然后将testBeanSrc的路径从空文件更改为包含p:dataTable的文件


还有其他解决办法吗?哪一个副作用最小?

用空列表初始化datatable?我想避免首先创建bean,我试图减少每个用户的内存占用,我们有很多这样的情况,在这些情况下创建bean时从未真正使用过。一种空bean是1k内存,如果同时有1000个用户,则为1MB。即使您有50个位置,它仍然是50MB。我无法想象这是个问题。如果空bean的使用(方式)超过了这一点,那么您就有一个设计问题(例如,不是空列表,不是延迟加载东西等)。UI层不应该是解决这个问题的地方。我同意。问题是这是一个使用Seam多年来不断增长的堆栈。这些bean中有很多都是注入(和创建)的其他bean反过来,它们通常在@Create方法中进行一些初始化。一些初始化没有错,但加载完整的数据集通常没有错。您不能改变这一点吗(同时切换到cdi;-)?如果你能用PF版本的6.x(最好是6.2)做一个真实的尝试,我会看看是否能在周末进行调查。我不打算调查PF 5.x版本。。。Abnd根据PF和JSF(以及impl(mojarra/myfaces))您当前的版本是什么