通过<p:dialog>和<ui:include> </ui:include> </p:dialog>使用PrimeFaces启动对话框

时间:2013-02-14 17:12:29

标签: jsf jsf-2 primefaces

我正在为我的网页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都被创建,初始化等,甚至用户也许永远不会真正点击按钮。这会产生大量开销,并使执行变慢。

我可以避免这个吗?

2 个答案:

答案 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>