2013-02-26 75 views
3

我注意到,有“动态”属性设置为“真”在短暂的延迟之后才会显示出来(这是可以理解的),也不会触发几乎所有的PF分量ajaxstatus ajax开始/停止事件。如何显示动态Primefaces组件

这是我的(正常使用)的Ajax状况组件,略去了实际对话内容:

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

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

<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"/> 
而命令按钮提交数据到后台bean显示

阿贾克斯状态对话框和获取数据。然后ajax状态对话框消失,延迟1-2秒,并显示确认对话框。与动态加载凸片

同样的情况(在PF TabView的分量)。

为什么动态组件负载时不显示我的AJAX状态对话框?我如何显示它?

编辑:

由于@partlov我想出了一个解决方案,而重写PF功能,通过添加JQ AJAX启动/停止处理程序,以动态加载的对话框:

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

你在哪里放了jQuery开始/停止代码? – Seitaridis 2013-05-23 13:30:43

+0

页面中的任何位置。然而,也http://stackoverflow.com/questions/16173811/cannot-show-dialog-in-primefaces-requestcontext-execute-call看到如需要加强状态对话框一切正常 – rootkit 2013-05-24 14:47:50

回答

5

作为写入Primefaces文档中<p:ajaxStatus>只是截取全局AJAX请求,而这个请求不是全局的。没有简单的方法来做到这一点你想要的。由于加载对话的时间很短,我真的不明白这一点。我认为唯一的解决方案是重载Primefaces对话框JavaScript方法。

Primefaces时对话框的内容加载,所以你可以覆盖这个这个方法调用loadContents()方法。我不建议你这样做,因为这是无证,可以在Primefaces的未来版本中改变:

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

这将显示您的动态加载对话框。您可以使用onShowp:dialog属性关闭对话框:

onShow="statusDialog.hide()" 
+0

谢谢你!我不知道对话加载不是全局的Ajax调用。我不认为它在文档中的任何地方提到过。 – rootkit 2013-02-26 23:14:25

+0

@rootkit你对对话加载意味着什么,显示加载动画/消息或对话内容加载的对话框? – 2013-02-27 01:06:59

+0

@LuiggiMendoza,我有两个对话框:一个是ajax状态对话框(只显示'正在加载...'),另一个弹出模式对话框向用户显示动作确认。确认对话框的属性dynamic = true。我的问题是/确认对话框加载时,没有显示ajax状态。这可能需要几秒钟或更长时间,用户可能会对为什么没有发生任何事情感到困惑。 – rootkit 2013-02-27 14:31:39