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