通过设计决策或Adobe改变了HTTPService对象触发的ResultEvent的内容。
看一下下面的例子:
var httpService:HTTPService = myHTTPServices.getResults();
httpService.addEventListener(ResultEvent.RESULT,resultHandler);
httpService.send();
/**
* Handels the login process
*/
function resultHandler(event:ResultEvent):void
{
// get http service
var httpService = (event.target as HTTPService);
// do something
}
它与Flex 3.2的魅力相似。但是当我尝试使用Flex 3.5或Flex 4.0 event.target编译它时,因为HTTPService 为null。
我发现event.target现在是 HTTPOperation 的一个实例。这很有趣,因为我在langref中找不到 HTTPOperation 。但是,我认为Flash Builder的调试器意味着 mx.rpc.http.Operation 。
调试器还显示 event.target 具有私有属性 httpService ,这是我希望通过 event.target 获得的实例。但它是私有的,所以 event.target.httpService 不起作用。
如果我只想删除EventListener,我可以将 event.target 强制转换为 EventDispatcher 。但我需要使用 HTTPService 中的方法。
那么:如何从ResultEvent中获取 HTTPService 实例?
任何帮助将不胜感激。谢谢!
学家
答案 0 :(得分:2)
如果你进入这个目的,通过源代码是很有用的。在OS X上,rpc
类位于此处:/Applications/Adobe Flash Builder Beta 2/sdks/3.4.1/frameworks/projects/rpc/src
在mx.rpc.http.HTTPService
内,确实有一个名为HTTPOperation
的内部类。
它扩展mx.rpc.http.AbstractOperation
,后者又扩展mx.rpc.AbstractOperation
。内部AbstractOperation
是一个getter方法get service
,它会返回您需要的内容。
由于HTTPService
是一个内部类,因此它实际上是私有的,因此您需要转换为AbstractOperation
(mx.rpc.http.AbstractOperation
或mx.rpc.AbstractOperation
)。
类似于:
function resultHandler(event:ResultEvent):void
{
// get the operation
var operation:AbstractOperation = AbstractOperation(event.target);
// get http service
var httpService:HTTPService = HTTPService(operation.service);
}
编辑:我收回了它!看起来Adobe在构建HTTPOperation时调用super时为服务发送null
。因此,HTTPService仅缓存在私有变量httpService
中。我不知道为什么他们会把它隐藏起来,但看起来你必须保持自己的参考。
答案 1 :(得分:2)
我为自己解决了这个问题。
HTTPService
中有一些属性可以从AbstractOperation
获得。例如,我使用属性request
,它是一个对象:
myService.request["service"] = myService;
之后,当我在HTTPOperation
获得event.currentTarget
的事件时,我会以这样的方式获得HTTPService
:
var eventService : HTTPService = HTTPService( AbstractOperation( event.currentTarget ).request["service"] );