从 Managed Bean 函数调用 Primefaces 对话框
Posted
技术标签:
【中文标题】从 Managed Bean 函数调用 Primefaces 对话框【英文标题】:Calling Primefaces dialog box from Managed Bean function 【发布时间】:2013-11-09 18:54:39 【问题描述】:您好,我有一个带有一些功能的托管 bean,根据该功能中的某些条件,我想调用一个对话框
托管 bean 函数如下
public String editStudent()
setReadOnly(false);
setButton(true, true, true, false, true, true,true);
LockItem lItem;
if(selectStudent !=null)
lItem = (LockItem) services.getbyId("LockItem", condition);
if (lItem == null)
System.out.println("Student Avalibale for process :::");
studentRedirect();
return "studentEdit.jsf?faces-redirect=true";
else
//To show dialog from here
System.out.println("Student Not Avalibale : Locked By " + lItem.getLockedBy());
else
FacesMessage msg;
msg = new FacesMessage("Please select the record.");
FacesContext.getCurrentInstance().addMessage(null, msg);
return show("menu");
有什么方法可以让我们从这样的托管函数中调用对话框
【问题讨论】:
【参考方案1】:您可以使用RequestContext
(或PrimeFaces
,如果您使用的是6.2 或更高版本)类。
假设你有以下:
<p:dialog id="myDialogID" widgetVar="myDialogVar">
....
</p:dialog>
因此,您在 facelet 本身(即onclick=myDialogVar.show();
)中执行的方式也可以在托管 bean 中执行,如下所示:
对于 PrimeFaces
RequestContext context = RequestContext.getCurrentInstance();
context.execute("myDialogVar.show();");
对于 PrimeFaces >= 4.x 到 PrimeFaces (根据 @dognose 和 @Sujan)
RequestContext context = RequestContext.getCurrentInstance();
context.execute("PF('myDialogVar').show();");
对于 PrimeFaces >= 6.2
PrimeFaces current = PrimeFaces.current();
current.executeScript("PF('myDialogVar').show();");
这是为了使用目标对话框。如果您只需要显示一条消息而不优先考虑任何自定义对话框,那么您可以这样做:
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Message Title", "Message body");
// For PrimeFaces < 6.2
RequestContext.getCurrentInstance().showMessageInDialog(message);
// For PrimeFaces >= 6.2
PrimeFaces.dialog().showMessageDynamic(message);
您也可以传入参数并设置回调。请参阅链接中的展示示例。
另请参阅:
Primefaces Dialog framework【讨论】:
【参考方案2】:如果您使用的是 primeface 4.0 或更高版本:
RequestContext.getCurrentInstance().execute("PF('yourdialogid').show()");
【讨论】:
【参考方案3】:Vrushank 的解决方案是正确的。
还有另一种方法:在你的对话框中,将渲染属性绑定到你的 bean 的布尔值,并将可见属性设置为 true,如下所示:
<p:confirmDialog
widgetVar="myDialog"
visible="true"
rendered="#myBean.showMyDialog">
在您的 bean 中的动作监听器中,您只需调用 setShowMyDialog(true)
,就会显示一个对话框(假设您的对话框正在被此动作更新)。如果出于某种原因您不希望在用户看不到对话框的 html 时呈现该对话框的 HTML,则此方法很有用。这样,在您的 bean 中,您可以访问信息,无论您的对话框是否可见。
此解决方案的另一个好处是,您的对话框不会在 ajax 更新(对话框或其父级)时隐藏。
【讨论】:
以上是关于从 Managed Bean 函数调用 Primefaces 对话框的主要内容,如果未能解决你的问题,请参考以下文章
face-config.xml 文件中的 <managed-bean-scope> 标签有啥用? [复制]
即使在刷新页面后,Firefox 也会在 JSF-Viewscoped-Managed-Bean 中保留数组的内容