为Flex应用程序实现“请稍候”控件的提示

时间:2008-11-18 23:52:29

标签: flex web-services pleasewait

对于长时间运行的操作(如调用Web服务),为Flex应用程序设置“请等待”控件的巧妙方法是什么。

我不是在询问它的图形部分 - 只是'控制器'部分。我该如何触发并隐藏它。我打算只用一个带有文本的简单画布。

例如:

  • 我可以以某种方式拦截所有Web服务调用 - 而不必为每个Web服务激活它
  • 我应该如何将它添加到我的画布上。它应该作为顶级组件添加到“舞台”吗?
  • 如果需要太长时间,它应该有一个“取消”按钮来取消Web服务请求。这听起来有点复杂,因为我甚至不确定是否可以终止正在运行的异步Web请求?

仅供参考:这适用于报告应用程序,因此需要长时间运行查询

2 个答案:

答案 0 :(得分:1)

我过去做过的一种方法是拥有一个全局整数,并根据运行的Web服务递增/递减该值。当计数器为0时,我会隐藏加载文本,当它大于0时,我会显示加载文本。以下是它的简化版本:


<mx:Application>
    <mx:Script>
        [Bindable]public var ws_count:int = 0;
    </mx:Script>
    <mx:Label text = "loading..." visible="{ws_count > 0}" />
</mx:Application>


然后我有一个小助手类来控制全局计数器:


package ws {
    import mx.core.Application;
    public class WSCounter {
        public static function sent():void {
            Application.application.ws_count += 1;
        }
        public static function receive():void {
            Application.application.ws_count -= 1;
        }
    }
}

然后,所有需要做的就是在调用Web服务时调用辅助函数...例如:


import ws.WSCounter;
import mx.rpc.http.HTTPService;

var srv:HTTPService = new HTTPService();
srv.url = "http://localhost/service.py";
srv.addEventListener(ResultEvent.RESULT,function(event:ResultEvent):void {
    WSCounter.receive();
});
srv.send();
WSCounter.sent();

我一直认为有更好的方法可以做到这一点,就像你说有一些类型的钩子来检测一个服务是否正在运行......我期待着这篇文章中的其他回复...

答案 1 :(得分:0)

如果您正在使用像Cairngorm或类似的实现MVC的框架,那么直接的方法是更新绑定到UI组件的“全局”变量(通过Singleton对象)(即主mxml或其他下的titleWindow)可见属性。变量将在execute()期间更新为true,并在到达结果或错误回调方法时更新为false。
您可以添加一个“取消”按钮,将变量重置为“false”,但这并不意味着服务器将停止异步调用。我不知道如何阻止它并阻止它从已取消的方法调用返回数据。快速查看ASDoc,remoteobject确实有一个disconnect()方法,它丢弃所有待处理的请求响应者。我不确定它是否优雅/正确的方式来做到这一点 如果您不想为每个Web服务调用设置它,您可能希望使用自定义事件链接(请参阅http://www.herrodius.com/blog/80了解建议),这样,如果您要调用单个或多个服务,则只需设置一次。