我有一个动态对话框
<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>
正在初始化testBean,并在辅助bean上调用testBean.getSomeArrayList()。 我已经读过ui:includes(参见Launching dialogs using PrimeFaces via <p:dialog> and <ui:include>)的情况,但是为什么p:dataTable的情况呢?顺便说一句。在p:dataTable周围放置渲染也没有解决问题。
我有什么选择不立即初始化testBean? 我可以使用c:if但是根据我的经验,当你混合使用JSTL和JSF时,你会得到奇怪的结果。我通常只使用它来排除不会呈现的内容(即使在一些ajax请求之后)。当我之前使用ajax时,它确实有效,但可能会导致意外问题。
我能看到的另一个选择是使用ui:include with dynamic 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的文件。
还有其他解决方案吗?哪一个副作用最小?