【问题标题】:Primefaces onclick and onsuccess differencesPrimefaces onclick 和 onsuccess 的区别
【发布时间】:2011-11-16 03:59:14
【问题描述】:

我有以下情况:

点击按钮后,一些业务逻辑完成,完成后,应该可以看到一个带有报告的新选项卡。

<p:commandButton value="this button" update="growlMain"
                 actionListener="#{myBean.businesslogic}" 
                 onstart="ajaxDialog.show();"
                 oncomplete="ajaxDialog.hide();"
                 onsuccess="window.open('./report.jsp', '_newtab');" />

这不起作用:(

如果业务逻辑只持续几毫秒,则以下工作:

<p:commandButton value="this button" update="growlMain"
                 actionListener="#{myBean.fastbusinesslogic}" 
                 onclick="window.open('./report.jsp', '_newtab');" />

onclick 会打开一个新选项卡,也可以使用 onstart 之类的内容,但它不适用于 onsuccess 或 oncomplete。为什么?是否有持续几秒钟的业务逻辑解决方案?

【问题讨论】:

  • 您的问题令人困惑......您是什么意思“持续几秒钟的业务逻辑”?您是说要在服务器端 actionListener businessLogic 完成后调用 window.open('./report.jsp', '_newtab'); 吗?

标签: jsf primefaces


【解决方案1】:

在创建 ajax 请求之前调用 onclick(纯客户端),而在服务器响应 ajax 请求之后执行 oncomplete 和 onsuccess。因此,如果您需要在显示对话框之前执行一些业务逻辑,例如,您希望使用 oncomplete。这就是我一直使用的。

您还可以在 oncomplete 中设置 javascript 以仅在没有验证错误的情况下执行。直觉上我认为 onsuccess 会表现得像那样,并且只有在没有验证错误时才会执行,但这不是它的方式。我真的不知道他们之间的区别。我认为有一种方法可以在支持 bean 中标记 success=false,但我在文档中找不到它。

如果您想检查 oncomplete 属性中的验证,您可以这样做:

oncomplete="if (!args.validationFailed){someDialog.hide()}"

在这种情况下,只有在正确验证字段时才关闭对话框。您实际上可以从支持 bean 注入参数,并在服务请求后在 javascript 中使用它们。在您的支持 bean 中,您可以执行以下操作:

RequestContext.getCurrentInstance().addCallbackParam("showDialog", false);

您可以在不完整的属性中访问这样的参数:

oncomplete="if (args &amp;&amp; args.showDialog){someDialog.show()}else{ alert('the bean didnt let me open the dialog')}"

无论如何,我希望这会有所帮助。

【讨论】:

  • 我需要转义 tha & 符号:oncomplete="if (args && args.showDialog){ dialog1.show() }else{ alert('bean 没有让我打开对话框')}"
【解决方案2】:

我注意到 PrimeFaces 命令按钮的 onsuccess 不起作用。然而,即使出现错误,oncomplete 也能正常工作并且需要,例如在我的情况下,即使我的业务逻辑出现错误,也会显示成功对话框。尝试使用 onsuccess 但不起作用。 您可以按如下方式尝试 oncomplete:

<p:commandButton value="this button" update="growlMain"
                 actionListener="#{myBean.businesslogic}" 
                 onstart="ajaxDialog.show();"
                 oncomplete="ajaxDialog.hide(); window.open('./report.jsp', '_newtab');"/>

【讨论】:

    【解决方案3】:

    你可以在这里看到区别:

    Primefaces and ajax onsuccess event

    或者通过 onsuccess 你可以在完全加载 DOM 之前做一些事情

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多