Primefaces 对话框框架在使用 ajax 侦听器时不起作用

Posted

技术标签:

【中文标题】Primefaces 对话框框架在使用 ajax 侦听器时不起作用【英文标题】:Primefaces dialog framework not working while using ajax listener 【发布时间】:2014-05-05 22:02:18 【问题描述】:

我正在尝试使用 Primefaces 4 对话框框架打开对话框,

public void openDialog(String viewName) 
  RequestContext.getCurrentInstance().openDialog(viewName);

这行得通:

<p:commandButton value="Click" action="#impaktDialogBean.openDialog('/popup/test2')"/>

这不是:

<p:commandButton value="Click">     
  <p:ajax event="click" listener="#impaktDialogBean.openDialog('/popup/test2')" ></p:ajax>
</p:commandButton>

所以,Primefaces 对话框框架只适用于 action 和 actionListener?????

我正在使用:

Primefaces 4 雄猫 7 JSF 2.2.6 莫哈拉

谢谢。

【问题讨论】:

p:commandButton 默认有ajax="true",为什么要调用p:ajax,你有没有试过让ajax="false"。 是的,我知道,但是如果我想打开关于无法触发操作的事件的对话框,例如数据表行选择?????...ajax=false 不起作用。 【参考方案1】:

我知道这个问题是很久以前提出的,但对于未来......

&lt;p:remoteCommand&gt; 呢?

<p:remoteCommand name="remoteCmd" update="anything" actionListener="#impaktDialogBean.openDialog('/popup/test2')" />

<p:commandButton value="Click" update="anything" onclick="remoteCmd()" >

实现对 bean 的 javascript 调用的不同方法。

【讨论】:

【参考方案2】:

我发现的最简单的解决方案是通过 javascript 启动按钮。

打开对话框的按钮(可能隐藏):

<p:commandButton id="myButton" action="#bean.openMyDialog" style="display:none" />

“点击”按钮的 ajax 事件:

<p:ajax ... oncomplete=" $('#myButton').click() " />

【讨论】:

【参考方案3】:

你有这个:

public void openDialog(String someView) 
    RequestContext.getCurrentInstance().openDialog(someView);

所以当你这样做时:

<h:form id="form">
    <p:commandButton id="button" value="Click" actionListener="#bean.openDialog('someView')" />
</h:form>

您在 Ajax 响应中收到此信息:

PrimeFaces.openDialog(
    url:'/some/address/view.xhtml',
    pfdlgcid:'cf8e7955-a6cf-4dd8-9a07-55cd29696a64',
    sourceComponentId:'form:button',
    sourceWidget:PF('widget_form_button'),
    options:);

所以,你可以试试这个:

<h:form id="form">
    <p:commandButton id="button" value="Click" onclick="PrimeFaces.openDialog(
        url:'/some/address/view.xhtml',
        pfdlgcid:'cf8e7955-a6cf-4dd8-9a07-55cd29696a64',
        sourceComponentId:'form:button',
        sourceWidget:PF('widget_form_button'),
        options:);" />
</h:form>

你甚至可以使用返回值:

<h:form id="form">
    <p:growl id="growl" showDetail="true" />

    <p:commandButton id="button" value="Click" onclick="PrimeFaces.openDialog(
        url:'/some/address/view.xhtml',
        pfdlgcid:'cf8e7955-a6cf-4dd8-9a07-55cd29696a64',
        sourceComponentId:'form:button',
        sourceWidget:PF('widget_form_button'),
        options:);">

        <p:ajax event="dialogReturn" listener="#bean.returnedValue" update="growl" />
    </p:commandButton>
</h:form>

AJAX 只是将结果转为目标 url。如果您已经有目标网址,则无需执行此操作。在我的基本测试中,这运行良好,与原始测试完全一样,只是您必须在“url”字段中传递目标地址,而不是结果。

希望这会有所帮助。

【讨论】:

是的,它有效,你可以把它放在oncomplete ajax 属性上,对话框就会被触发。但是硬编码pfdlgcid?? 是安全的它的自然行为似乎在每次调用时都会随机变化。

以上是关于Primefaces 对话框框架在使用 ajax 侦听器时不起作用的主要内容,如果未能解决你的问题,请参考以下文章

对话框关闭事件后 Primefaces 更新组件

如何从primefaces中的javascript触发组件刷新?

如何在 JSF 上延迟 Primefaces AjaxStatus?

使用ajax从jsf中的primefaces树选定项设置primefaces selectOneMenu默认值

Primefaces选项卡ajax部分更新错误

JSF 2.0 无法从 primefaces 呈现对话框