对于长时间运行的操作(如调用Web服务),为Flex应用程序设置“请等待”控件的巧妙方法是什么。
我不是在询问它的图形部分 - 只是'控制器'部分。我该如何触发并隐藏它。我打算只用一个带有文本的简单画布。
例如:
仅供参考:这适用于报告应用程序,因此需要长时间运行查询
答案 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了解建议),这样,如果您要调用单个或多个服务,则只需设置一次。