通过辅助bean包含来自另一个文件的对话框

时间:2014-09-16 12:56:45

标签: jsf primefaces dialog jsf-2.2

我有一个Primefaces项目,我试图复制桌面应用程序的行为。由于桌面应用程序的性质,有相当多的弹出对话框,导致页面处理变得非常慢(初始页面加载:10-20秒,AJAX请求:6-10秒)。

我已经有了所有对话框的单独文件,我想使用支持bean将它们作为对话框弹出,而不必在我的主文件中使用<ui:include>。有没有办法做到这一点?

e.g:

<p:commandButton id="showSearchDialog"
                 action="#{managedBean.showSearchDialog()}"/>
<p:dialog widgetVar="searchDialog">
</p:dialog>
public class ManagedBean {
  public void showSearchDialog() {
    //Some sort of function that knows to process the contents of searchDialog.xhtml
    //  and insert it into the relevant <p:dialog>

    RequestContext.getCurrentInstance().execute("PF('searchDialog').show()");
  }
}

1 个答案:

答案 0 :(得分:1)

如果你的目标是减小页面的大小,我会通过对象本身的条件呈现来处理它,这是由一个由命令操作设置的支持bean属性决定的:

<p:commandButton id="showSearchDialog"
                 action="#{managedBean.showSearchDialog()}"
                 update="dialogs"
                 oncomplete="PF('searchDialog').show()" />
<h:panelGroup id="dialogs" layout="block">
 <p:dialog widgetVar="searchDialog" rendered="#{managedBean.currentDialog eq 'search'}">
  <ui:include src="searchDialog.xhtml" />
 </p:dialog>
</h:panelGroup>
public class ManagedBean {
  private String currentDialog;
  public String getCurrentDialog() { return currentDialog; }
  public void showSearchDialog() { currentDialog = "search"; }
}

然后,您可以有条件地在“对话框”块中呈现所有对话框,并使用ajax动态刷新呈现的内容。


另一个需要考虑的选择是使用PrimeFaces对话框架,它允许您在运行时动态呈现外部页面。