【问题标题】:How to show ajaxstatus for dynamic Primefaces components如何显示动态 Primefaces 组件的 ajaxstatus
【发布时间】:2013-02-12 12:40:17
【问题描述】:

我注意到几乎所有将 'dynamic' 属性设置为 'true' 的 PF 组件只会在短暂的延迟后显示(这是可以理解的),并且也不会触发 ajax 启动/停止事件。

这是我的(完美运行的)Ajax 状态组件,为简洁起见省略了实际的对话框内容:

<p:ajaxStatus onstart="statusDialog.show();" onsuccess="statusDialog.hide();" onerror="errorDialog.show();"/> 

这是一个动态加载的对话框。它需要从 backing beans 中获取数据:

<p:dialog modal="true" widgetVar="confDialog" position="center" id="confD" dynamic="true">
<p:panelGrid>
<p:row>
    <p:column>
        <h:outputText value="Date"></h:outputText>
    </p:column>
    <p:column>
        <h:outputText value="#{myBean.currentDate}">
            <f:convertDateTime locale="#{myBean.currentLanguage}" type="both" dateStyle="full" timeStyle="full" timeZone="#{myBean.currentTimeZone}"></f:convertDateTime>
        </h:outputText>
    </p:column>
</p:row>
</p:panelGrid>
<p:commandButton value="Close" type="button" onclick="confDialog.hide();">
</p:commandButton>
</p:dialog>

执行某些操作并显示动态加载的确认对话框的命令按钮:

<p:commandButton value="Do it" type="submit" ajax="true" process="@form"
                action="#{bean.processForm}"
                oncomplete="if(!args.validationFailed){confDialog.show();}"
                update="confD @form"/>

Ajax 状态对话框在命令按钮提交数据到支持 bean 并取回数据时显示。然后ajax状态对话框消失,有1-2秒的延迟,显示确认对话框。

动态加载的选项卡(在 PF tabView 组件中)也会发生同样的情况。

为什么在动态组件加载期间我的 ajax 状态对话框不显示?怎么显示?

编辑:

感谢@partlov,我通过将 JQ ajax 启动/停止处理程序添加到动态加载的对话框中找到了一个不覆盖 PF 函数的解决方案:

jQuery(document).ready(function() {
 confDialog.getJQ().ajaxStart(function(){statusDialog.show()});
 confDialog.getJQ().ajaxStop(function(){statusDialog.hide()});
});

【问题讨论】:

标签: ajax jsf primefaces


【解决方案1】:

正如 Primefaces 文档中所写的那样,&lt;p:ajaxStatus&gt; 只是拦截全局 AJAX 请求,而这个请求不是全局的。没有简单的方法可以做到这一点。由于对话框的加载时间很短,我真的没有看到这一点。我认为唯一的解决方案是重载 Primefaces 对话框 JavaScript 方法。

在加载对话框内容时,Primefaces 会调用 loadContents() 方法,因此您可以为此重写此方法。我不建议您这样做,因为这是未记录的,并且可以在 Primefaces 的未来版本中进行更改:

jQuery(document).ready(function() {
  var oldLoadContents = PrimeFaces.widget.Dialog.loadContents;
  PrimeFaces.widget.Dialog.loadContents = function() {
    statusDialog.show();
    oldLoadContents();
  }
});

这应该会显示您的动态加载对话框。您可以使用p:dialogonShow 属性关闭对话框:

onShow="statusDialog.hide()"

【讨论】:

  • 谢谢!我不知道对话框加载不是全局 ajax 调用。我认为它在文档中的任何地方都没有提到。
  • @rootkit 对话框加载是什么意思,显示加载动画/消息或对话框内容加载的对话框?
  • @LuiggiMendoza,我有两个对话框:一个是 ajax 状态对话框(仅显示“正在加载...”),另一个是弹出模式对话框,用于向用户显示操作确认。确认对话框具有属性 dynamic=true。我的问题是/是在确认对话框加载时未显示 ajax 状态。这可能需要几秒钟或更长时间,用户可能会对为什么没有发生任何事情感到困惑。
  • 我也面临同样的问题。我无法链接到 loadContents。这是未定义的。你能解释一下覆盖 loadContents 的代码在哪里吗?
猜你喜欢
  • 2016-10-13
  • 2016-09-21
  • 1970-01-01
  • 2012-05-04
  • 2013-03-17
  • 2012-01-03
  • 2017-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多