2010-06-09 57 views
3

通过设计决定或者什么都不是Adobe更改了由HTTPService对象触发的ResultEvent的内容。HTTPService/ResultEvent与Flex 3.2对比Flex> = 3.5

看看下面的例子:

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为空。

我发现event.target现在是HTTPOperation的一个实例。这很有趣,因为我在langref中找不到HTTPOperation。但是,我认为Flash Builder的调试器的意思是mx.rpc.http.Operation

调试器也显示,event.target有私人属性的HTTPService这是我期望能获得与event.target实例。但它是私人的,所以event.target.httpService不起作用。

如果我只是想删除事件侦听我可以投event.target作为此事件。但我需要使用HTTPService中的方法。

因此:如何从ResultEvent获得HTTPService实例?

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

J.

回答

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是一个吸气方法get service它看起来要返回你所需要的。

由于HTTPService是一个内部类是有效的私人所以你需要强制转换为AbstractOperation(无论是mx.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时调用超级服务时发送服务null。 HTTPService因此只缓存在私有变量httpService中。我不知道他们为什么把它藏起来,但看起来你必须保留自己的参考。

+0

感谢您的回复!我会等待更多的想法,但我认为我必须保留自己的参考。虽然这将是很多工作! – Julian 2010-06-10 07:59:45

2

我自己解决了这个问题。 在HTTPService有一些物业可从AbstractOperation。例如,我使用属性request这是一个对象:

myService.request["service"] = myService; 

后来,当我得到事件,这在event.currentTargetHTTPOperation,我让我的HTTPService以这样的方式:

var eventService : HTTPService = HTTPService(AbstractOperation(event.currentTarget).request["service"]);