Гибкое добавление прослушивателей событий с функциями обратного вызова, которые не имеют аргументов - PullRequest
0 голосов
/ 10 июня 2009
fileReference.addEventListener(Event.COMPLETE, uploadCompleteHandler);

  private function uploadCompleteHandler(event:Event):void {}

Выше приведен один из способов добавления прослушивателя событий в Actionscript. По умолчанию функция обратного вызова должна иметь аргумент с Назовите событие и введите Событие. Есть ли способ объявить эту функцию без аргументов:

  private function uploadCompleteHandler():void {}

Редактировать: возможно добавить обработчик событий без аргументов в mxml. Итак, один студент хотел знать, почему нельзя сделать то же самое в ActionScript?

Ответы [ 2 ]

8 голосов
/ 10 июня 2009

Причина в том, что в mxml то, что вы пишете, на самом деле не обработчик, а то, что выполняется в обработчике. Если вы скомпилируете с флагом -keep-генерируемого действия (чтобы установить его в Flex Builder, щелкните правой кнопкой мыши, чтобы открыть Свойства проекта, выберите Компилятор Flex и добавьте -keep-генерированный-действия в дополнительные аргументы компилятора), вы можете увидеть сгенерировал исходный код для вашего компонента, чтобы компилятор создал обработчик для этого события, а тело состоит из того, что вы написали в mxml.

Так что если у вас есть что-то вроде:

click="doSomething();"

Вы уже можете заметить, что на самом деле вы даете там инструкцию, а не ссылку на метод, которую вы передаете, когда используете addEventHandler.

Тогда вы получите в сгенерированном файле что-то вроде:

private function myComponent_Click(evt : MouseEvent) : void
{
    doSomething();
}

И где-то еще в том же файле добавление прослушивателя событий:

this.addEventListener(MouseEvent.CLICK, myComponent_Click);

Обратите внимание, что второй параметр не является результатом функции, это ссылка на функцию, потому что круглые скобки, обозначающие вызов функции, отсутствуют, и наша конкретная функция также не является получателем.

Вы также можете указать больше вызовов в mxml, например:

click="doSomething(); doSomethingElse();"

Вы даже можете передать параметр события в ваш метод:

click="doSomething(event);"

Все, что вы пишете в значении события mxml (не уверен, что это правильный термин для использования), станет телом сгенерированного обработчика для события actionscript.

3 голосов
/ 10 июня 2009

Нет, вы получите исключение времени выполнения при возникновении события, если попытаетесь зарегистрировать его в качестве прослушивателя событий.

Вы можете использовать следующий синтаксис, чтобы разрешить вызов вашего обработчика напрямую без объекта события:

private function uploadCompleteHandler(event:Event = null):void {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...