我需要将Primefaces AJAX Status对话框的显示延迟X毫秒

时间:2013-09-20 12:19:12

标签: jsf primefaces omnifaces

我需要将Primefaces AJAX Status对话框的显示延迟X毫秒,但OmniFaces ExceptionHandler对javascript超时解决方案的反应非常糟糕。

这是我到目前为止所得到的:

<p:ajaxStatus onstart="showStatusDialog();" onsuccess="hideStatusDialog();" onerror="hideStatusDialog();"/>

<script type="text/JavaScript">
    var statusDlgTimer = null;

    function showStatusDialog()
    {
        if (statusDlgTimer === null) 
        {
            statusDlgTimer = setTimeout("statusDialog.show()", 700);
        }
    }

    function hideStatusDialog()
    {
        if (statusDlgTimer !== null) 
        {
            clearTimeout(statusDlgTimer);
            statusDialog.hide();
            statusDlgTimer = null;
        }
    }
</script>

只要AJAX调用中没有错误发生,这就完美无缺。我正在使用OmniFaces FullAjaxExceptionHandler来处理AJAX /非AJAX异常。

我的假设是,由于在呈现错误页面时重新加载JavaScript,因此永远不会检测到对statusDlgTimer的引用!== null,但我还没有找到一个好的解决方法。

2 个答案:

答案 0 :(得分:4)

FullAjaxExceptionHandler基本上用错误页面的内容替换整个HTML文档树,因此<p:ajaxStatus>&#34;迷路了#34;并且永远不会调用它的oncomplete。您基本上也需要从错误页面的HTML源代码中调用hideStatusDialog()。也许是这样的:

<h:outputScript target="body">hideStatusDialog();</h:outputScript>

更好的是,在全局JS文件中使用$(document).ajaxStart()ajaxComplete()ajaxError(),而不是整个<p:ajaxStatus>

答案 1 :(得分:2)

在一位同事的帮助下,我实际上找到了另外两个工作,后者类似于BalusC的解决方案。

  1. 通过设置变量'var displaydialog = false'onload并在设置超时之前将其设置为true对话框。在实际显示变量之前,我在中间函数中检查了相同的变量。有点困难和hackish,但它的确有效。
  2. 我的JavaScript包含在我的Facelets模板中,错误页面也使用了该模板。通过创建另一个模板,我能够使用ui:insert来避免将JavaScript完全插入到错误页面中,并且不显示对话框。我选择了这个解决方案。