我正在为我的网页UI项目使用PrimeFaces UI库。
我有一个manage_watchfolder.xhtml
页面,其中有一个按钮,此按钮会启动一个对话框:
<p:commandButton value="Add" oncomplete="dlgEditWF.show()"
update=":editWFForm" process="@none"/>
在同一个文件中,我dlgEditWF
包含edit_watchfolder.xhtml
:
<p:dialog id="editDialog" widgetVar="dlgEditWF" modal="true"
resizable="true" onShow="showHideActionLocation();">
<ui:include src="edit/edit_watchfolder.xhtml"/>
</p:dialog>
问题在于,在单击按钮之前,我不希望{strong} 加载。但是,edit_watchfolder.xhtml
在创建edit_watchfolder.xhtml
的同时被“加载”。因此,从manage_watchfolder.xhtml
调用的所有bean都被创建,初始化等,甚至用户也许永远不会真正点击按钮。这会产生大量开销,并使执行变慢。
我可以避免这个吗?
答案 0 :(得分:5)
这是“按设计”出于此答案中解释的原因:Skip executing <ui:include> when parent UI component is not rendered。
在您的特定情况下,最好的办法是默认情况下保持bean未初始化,并在命令按钮的操作方法中执行初始化。
<p:commandButton value="Add" action="#{bean.initDialog}"
process="@this" update=":editWFForm" oncomplete="dlgEditWF.show()" />
答案 1 :(得分:4)
您可以使用p:dialog
的“动态”属性。看看主要的documentation。
<p:commandButton id="basic" value="Show Dialog" onclick="dlg.show();" type="button" />
<p:dialog id="dialog" header="Dynamic Dialog" widgetVar="dlg" dynamic="true">
<h:outputText value="This content is loaded lazy." />
</p:dialog>