2010-06-09 8 views
3

grâce à une décision de conception ou quoi que ce soit Adobe a modifié le contenu de ResultEvent déclenché par un objet HTTPService.HTTPService/ResultEvent avec Flex 3.2 versus Flex> = 3.5

Jetez un oeil à exemple suivant:

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 
} 

Il fonctionne comme un charme avec Flex 3.2. Mais lorsque j'essaie de le compiler avec Flex 3.5 ou Flex 4.0 event.target comme HTTPService est null.

J'ai découvert que event.target est maintenant une instance de HTTPOperation. C'est intéressant parce que je ne peux pas trouver HTTPOperation dans le langref. Cependant, je pense que le débogueur de Flash Builder signifie mx.rpc.http.Operation.

Le débogueur montre également que event.target a un attribut privé HttpService qui est l'instance que je m'y attendais à obtenir avec event.target. Mais c'est privé, donc event.target.httpService ne fonctionne pas.

Si je veux seulement enlever le EventListener je peux jeter event.target comme EventDispatcher. Mais j'ai besoin d'utiliser des méthodes de HTTPService. Donc, comment puis-je obtenir l'instance HTTPService à partir de ResultEvent?

Toute aide serait appréciée. Merci!

J.

Répondre

2

Il est utile de passer par la source si vous entrez dans ce. Sur OS X les rpc classes sont ici: /Applications/Adobe Flash Builder Beta 2/sdks/3.4.1/frameworks/projects/rpc/src

intérieur mx.rpc.http.HTTPService il y a en effet une classe interne nommée HTTPOperation. Il s'étend mx.rpc.http.AbstractOperation qui à son tour s'étend mx.rpc.AbstractOperation. Inside AbstractOperation est une méthode getter get service qui a l'air de retourner ce dont vous avez besoin.

Depuis HTTPService est une classe interne, il est vous efficacement privé donc vous devez jeter un AbstractOperation (soit mx.rpc.http.AbstractOperation ou mx.rpc.AbstractOperation).

donc quelque chose comme:

function resultHandler(event:ResultEvent):void 
{ 
    // get the operation 
    var operation:AbstractOperation = AbstractOperation(event.target); 

    // get http service 
    var httpService:HTTPService = HTTPService(operation.service); 
} 

modifier: Je les! On dirait que Adobe envoie null pour le service quand il appelle le super lors de la construction de l'HTTPOperation. Le HTTPService est donc uniquement mis en cache dans la variable privée httpService. Je ne sais pas pourquoi ils te le cachent, mais il semble que tu devras garder ta propre référence.

+0

Merci pour votre réponse ! J'attendrai d'autres réflexions, mais je pense que je dois garder mes propres références. Ce sera beaucoup de travail si! – Julian

2

J'ai résolu ce problème pour moi-même. Certaines propriétés de HTTPService sont disponibles à partir de AbstractOperation. Par exemple, j'utilise la propriété request qui est un objet:

myService.request["service"] = myService; 

Et plus tard, quand je reçois l'événement qui a HTTPOperation dans event.currentTarget, je reçois mon HTTPService de telle façon:

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