gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:41:15 26 4
gpt4 key购买 nike

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

这是一个例子:

界面部分

<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> .

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

最佳答案

看看primefaces documentation对于 p:dialog (与 p:menuitem 和 onclick 存在同样的问题)。文档中有关于 onShow 的说明:

Client side callback to execute when dialog is displayed. (emphasis added)

这意味着您可以在那里指定一个 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()">

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com