2

什么是为 Flex 应用程序制作“请稍候”控件以进行长时间运行的操作(如调用 Web 服务)的聪明方法。

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

例如 :

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

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

4

2 回答 2

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();

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

于 2008-11-19T14:57:34.893 回答
0

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

于 2008-11-21T23:15:20.393 回答