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

时间:2014-06-30 20:49:57

标签: java jsf primefaces lazy-loading lazy-initialization

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

以下是一个例子:

UI部分

<h:form id="form1">
    <p:menubar id="mainMenu">
    <p:submenu label="Main menu" icon="ui-icon-document">
        <p:menuitem value="My settings" onclick="mySettingsWv.show()" url="#" />
    </p:submenu>
    </p:menubar>
</h:form>

<p:dialog id="mySettingsDlg" header="My Settings" widgetVar="mySettingsWv" resizable="false"
          closable="true" modal="true" showEffect="fade" hideEffect="explode" dynamic="true"
          closeOnEscape="true" onShow="#{mybean.onShow()}">
        <h:outputLabel value="Settings dialog" />
</p:dialog>

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");
     }
}

如果我为<p:menuitem>使用动作“onclick”来手动调用必要的方法,它仍然会为每个页面重新加载执行它。此外,如果我尝试使用actionListener,则操作属性不起作用。 <p:ajax>无法附加<p:menuitem>

在这种情况下我该怎么办?我的代码中有什么问题?

1 个答案:

答案 0 :(得分:1)

查看p:dialog的素数documentation(与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"/>

然后将此回调指定为onShow属性:

<p:dialog id="mySettingsDlg" ...
      onShow="onShow()">