Flex 3.2的HTTPService / ResultEvent与Flex> = 3.5

时间:2010-06-09 19:05:52

标签: actionscript-3 flex3 flex4 httpservice

通过设计决策或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 实例?

任何帮助将不胜感激。谢谢!

学家

2 个答案:

答案 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是一个内部类,因此它实际上是私有的,因此您需要转换为AbstractOperationmx.rpc.http.AbstractOperationmx.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"] );