3

通过设计决策或 Adob​​e 改变了由 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为空。

我发现 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实例?

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

J。

4

2 回答 2

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

编辑:我收回它!看起来 Adob null​​e 在构造 HTTPOperation 时调用超级服务时正在发送服务。HTTPService 因此只缓存在私有变量httpService中。我不知道他们为什么对你隐藏它,但看起来你必须保留自己的参考。

于 2010-06-09T21:57:43.080 回答
2

我为自己解决了这个问题。其中有一些属性HTTPService可从AbstractOperation. 例如,我使用request作为对象的属性:

myService.request["service"] = myService;

后来,当我得到有HTTPOperationin 的Event 时event.currentTarget,我HTTPService以这种方式得到我的:

 var eventService : HTTPService = HTTPService( AbstractOperation( event.currentTarget ).request["service"] );
于 2011-11-17T06:45:05.770 回答