我在使用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,则action属性无效。 <p:ajax>无法附加到<p:menuitem>

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

最佳答案

看看p:dialog的素面符号documentation(与p:menuitem和onclick相同的问题)。那里的文档说关于onShow


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


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

要解决此问题,您必须定义一个JavaScript回调,以便在Bean上进行调用。您可以使用p:remoteCommand来做到这一点:

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


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

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

关于java - 每次重新加载页面时都会不必要地触发onShow事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24498716/

10-10 19:22