首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何显示动态Primefaces组件的ajaxstatus

如何显示动态Primefaces组件的ajaxstatus
EN

Stack Overflow用户
提问于 2013-02-27 05:31:59
回答 1查看 8.6K关注 0票数 3

我注意到,几乎所有“dynamic”属性设置为“true”的PF组件只会在短暂的延迟后出现(这是可以理解的),而且也不会触发ajax start/stop事件。

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

代码语言:javascript
运行
复制
<p:ajaxStatus onstart="statusDialog.show();" onsuccess="statusDialog.hide();" onerror="errorDialog.show();"/> 

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

代码语言:javascript
运行
复制
<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>

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

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

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

动态加载的选项卡也是如此(在PF tabView组件中)。

为什么我的ajax状态对话框在动态组件加载过程中不显示?我该怎么展示它呢?

编辑:

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

代码语言:javascript
运行
复制
jQuery(document).ready(function() {
 confDialog.getJQ().ajaxStart(function(){statusDialog.show()});
 confDialog.getJQ().ajaxStop(function(){statusDialog.hide()});
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-27 06:24:06

正如Primefaces文档中所写的,<p:ajaxStatus>只拦截全局AJAX请求,而这个请求并不是全局的。没有简单的方法来做你想做的事情。由于加载对话框的时间很短,我真的看不出这一点。我认为,唯一的解决方案是重载Primefaces对话框的JavaScript方法。

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

代码语言:javascript
运行
复制
jQuery(document).ready(function() {
  var oldLoadContents = PrimeFaces.widget.Dialog.loadContents;
  PrimeFaces.widget.Dialog.loadContents = function() {
    statusDialog.show();
    oldLoadContents();
  }
});

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

代码语言:javascript
运行
复制
onShow="statusDialog.hide()"
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15099688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档