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

Dan*_*jel 2 jsf primefaces jsf-2

我正在为我的Web UI项目使用PrimeFaces UI库.

我有一个manage_watchfolder.xhtml有按钮的页面,这个按钮启动一个对话框:

<p:commandButton value="Add" oncomplete="dlgEditWF.show()"
    update=":editWFForm" process="@none"/>  
Run Code Online (Sandbox Code Playgroud)

在这个相同的文件中我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> 
Run Code Online (Sandbox Code Playgroud)

问题是,我不希望edit_watchfolder.xhtml加载单击该按钮之前.但是,edit_watchfolder.xhtmlmanage_watchfolder.xhtml创建的同一时刻"加载" .因此,所有调用的bean edit_watchfolder.xhtml都被创建,初始化等,甚至用户也许永远不会真正点击按钮.这会产生大量开销,并使执行变慢.

我可以避免这个吗?

Bal*_*usC 5

这是"按设计"出于此答案中解释的原因:当未呈现父UI组件时跳过执行<ui:include>.

在您的特定情况下,最好的办法是默认情况下保持bean未初始化,并在命令按钮的操作方法中执行初始化.

<p:commandButton value="Add" action="#{bean.initDialog}" 
    process="@this" update=":editWFForm" oncomplete="dlgEditWF.show()" />
Run Code Online (Sandbox Code Playgroud)