通过设计决策或其他任何方式,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 as HTTPService 为 null。
我发现 event.target 现在是 HTTPOperation 的一个实例。这很有趣,因为我在 langref 中找不到 HTTPOperation。但是,我认为 Flash Builder 的调试器意味着 mx.rpc.http.Operation。
调试器还显示 event.target 有一个私有(private)属性 httpService,这是我希望通过 event.target 获得的实例。但它是私有(private)的,所以 event.target.httpService 不起作用。
如果我只想删除 EventListener,我可以将 event.target 转换为 EventDispatcher。但我需要使用 HTTPService 中的方法。
那么:如何从 ResultEvent 中获取 HTTPService 实例?
如有任何帮助,我们将不胜感激。谢谢!
J.
最佳答案
如果你深入了解这个问题,那么通读源代码是很有用的。在 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
是一个内部类,它实际上是私有(private)的,因此您需要转换为 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 仅缓存在私有(private)变量 httpService
中。我不知道他们为什么对你隐瞒它,但看起来你必须保留自己的引用资料。
关于actionscript-3 - Flex 3.2 与 Flex >= 3.5 的 HTTPService/ResultEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3009010/