Java 在每个页面重新加载期间不必要地激发onShow事件

Java 在每个页面重新加载期间不必要地激发onShow事件,java,jsf,primefaces,lazy-loading,lazy-initialization,Java,Jsf,Primefaces,Lazy Loading,Lazy Initialization,我在使用Primefaces制作项目菜单时遇到问题。实际上,这个菜单可以让我显示一些带有工作区设置的小对话框(通过单击菜单项)。每个对话框都应该从数据库延迟加载数据。不幸的是,当我在页面中包含我的对话框(单个xhtml文件或两个带有ui:include的xhtml文件)时,每个页面上都会发生一个显示事件,这是错误的,并且会引发对数据库的太多不必要的请求 以下是一个例子: 用户界面部分 ManagedBean部分: @ManagedBean (name = "mybean") @ViewSco

我在使用Primefaces制作项目菜单时遇到问题。实际上,这个菜单可以让我显示一些带有工作区设置的小对话框(通过单击菜单项)。每个对话框都应该从数据库延迟加载数据。不幸的是,当我在页面中包含我的对话框(单个xhtml文件或两个带有ui:include的xhtml文件)时,每个页面上都会发生一个显示事件,这是错误的,并且会引发对数据库的太多不必要的请求

以下是一个例子:

用户界面部分


ManagedBean部分:

@ManagedBean (name = "mybean")
@ViewScoped
public class MyBean {
   public static Logger log = Logger.getLogger(MyBean.class);

    public void onShow() {
       log.info("Method onShow is being called on each page reloading, but dialog still has not been shown");
     }
}
如果我对
使用操作“onclick”来手动调用必要的方法,它仍然会在每次重新加载页面时执行该操作。此外,如果我尝试使用actionListener,则action属性无效<代码>无法附加到


那样的话我该怎么办?我的代码中可能有什么问题?

查看
p:dialog
的素面(与
p:menuitem
和onclick的问题相同)。在这里,文档中提到了关于
onShow

显示对话框时要执行的客户端回调。(增加重点)

这意味着您可以在那里指定一个javascript函数,但在backingbean上指定一个操作(每次显示对话框时都会调用该操作)并不起作用。在您的例子中发生的情况如下:
#{mybean.onShow()}
仅在解析文件时(即
p:dialog
呈现为HTML),然后将该方法返回的值插入其中(即空字符串)

要解决这个问题,您必须定义一个javascript回调,它对bean进行调用。您可以使用
p:remoteCommand

<p:remoteCommand name="onShow" action="#{mybean.onShow}"
      partialSubmit="true" process="@this"/>

您可以将对话框包装在一个带有“渲染”atribute的div中,这样它就不会显示在dom上,直到您真正想要它显示为止。并使用ajax调用来显示/隐藏它。您的问题是对话框总是显示在页面上,因此显示完成。
<p:dialog id="mySettingsDlg" ...
      onShow="onShow()">