HTTPService / ResultEvent с Flex 3.2 против Flex> = 3.5 - PullRequest
3 голосов
/ 09 июня 2010

из-за решения по дизайну или чего-то еще Adobe изменила содержимое ResultEvent, запущенного объектом HTTPService.

Взгляните на следующий пример:

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 . Это интересно, потому что я не могу найти HTTPOperation в langref. Однако я думаю, что отладчик Flash Builder означает mx.rpc.http.Operation .

Отладчик также показывает, что event.target имеет закрытый атрибут httpService , который я ожидаю получить с event.target . Но это личное, так что event.target.httpService не работает.

Если я хочу удалить только EventListener, я могу привести event.target как EventDispatcher . Но мне нужно использовать методы из HTTPService .

Итак: Как я могу получить экземпляр HTTPService из ResultEvent?

Любая помощь будет принята с благодарностью. Спасибо!

J.

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

Я решил эту проблему для себя.В HTTPService есть некоторые свойства, доступные из AbstractOperation.Например, я использую свойство request, которое является объектом:

myService.request["service"] = myService;

И позже, когда я получаю событие, которое имеет HTTPOperation в event.currentTarget, я получаю HTTPService таким образом:

 var eventService : HTTPService = HTTPService( AbstractOperation( event.currentTarget ).request["service"] );
2 голосов
/ 10 июня 2010

Полезно пройтись по источнику, если вы попали в это. На 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.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 отправляет null для службы, когда она вызывает super при создании HTTPOperation. Поэтому HTTPService кэшируется только в закрытой переменной httpService. Я понятия не имею, почему они скрывают это от вас, но похоже, что вам придется держать свою ссылку под рукой.

...