Общие события и дополнительные параметры в Actionscript 3.0? - PullRequest
1 голос
/ 16 сентября 2009

Принимая следующий шаблон:

someObjectInstance.addEventListener(MyDisplayObject.EVENT_CONSTANT, _handleMyEvent);


private function _handleMyEvent( event:Event = null ):void
{
  // Event handler logic...
}

Если я хотел добавить обязательный параметр в функцию-обработчик, могу ли я сделать это и все еще использовать «универсальное» событие и прослушиватель событий? Или я прав, предполагая, что мне нужно создать собственный класс событий, в котором есть параметр, и сослаться на него через объект события, передаваемый в функцию-обработчик?

Чтобы сформулировать это по-другому ... Если у меня есть функция обработчика, которая выглядит следующим образом:

private function _handleMyEvent( data:Object, event:Event = null ):void
{
  if (data == null)
  {
      return;
  }
  // Event handler logic...
}

Тогда как должна выглядеть функция addEventListener? Есть ли более продвинутый синтаксис? Есть ли способ сделать это с помощью замыканий?

Ищем пример четкого кода и / или справочную документацию. Просто пытаюсь понять, нужно ли мне в этом сценарии переопределять общий класс Event.

Ответы [ 3 ]

3 голосов
/ 16 сентября 2009

Если вам нужны пользовательские данные для путешествия с вашим событием, да, вам нужно создать собственный класс событий.

Вот простой пример:

package {
    import flash.events.Event;

    public class ColorEvent extends Event {
        public static const CHANGE_COLOR:String = "ChangeColorEvent";

        public var color:uint;

        public function ColorEvent(type:String, color:uint, bubbles:Boolean = false, cancelable:Boolean = false) {
            this.color = color;
            super(type, bubbles, cancelable);
        }

        override public function clone():Event {
            return new ColorEvent(type, color, bubbles, cancelable);
        }
    }
}

Обратите внимание, что метод клонирования НЕ является опциональным. Вы должны иметь этот метод в своем пользовательском классе, чтобы ваше событие когда-либо пересылалось должным образом (например, когда один объект получает событие, а затем повторно отправляет его как свое собственное).

Теперь, что касается отправки события, это будет работать следующим образом (очевидно, этот код будет идти в методе класса, который расширяет EventDispatcher).

dispatchEvent(new ColorEvent(ColorEvent.CHANGE_COLOR, 0xFF0000));

И, наконец, подписаться на событие:

function onChangeColor(event:ColorEvent):void {
    trace(event.color);
}

foo.addEventListener(ColorEvent.CHANGE_COLOR, onChangeColor);
1 голос
/ 24 ноября 2012

Подожди, все. См. этот ответ .

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

И это очень просто! Функция addEventListener остается прежней. Его слушатель будет настроен:

var functionHandleMyEvent:Function = _handleMyEvent(data);
someObjectInstance.addEventListener(MyDisplayObject.EVENT_CONSTANT, functionHandleMyEvent);
// Later, when you need to remove it, do:
//someObjectInstance.removeEventListener(MyDisplayObject.EVENT_CONSTANT, functionHandleMyEvent);

private function _handleMyEvent(data:Object):Function {
  return function(event:Event):void {
    if (data == null) {
      // Event handler logic here now has both "event" and "data" within your reach
    }
  }
}

Нет расширенного синтаксиса, но относительно продвинутая концепция: функции переменных . Вы можете делать замыкания с тем, что у нас здесь, но вам абсолютно не нужно. И поэтому вам также совершенно не нужно переопределять класс Event.

Надеюсь, эти примеры и документация проясняют для вас!

1 голос
/ 17 сентября 2009

Существует способ передачи пользовательских данных в метод обработчика без создания пользовательского события.

private function test() {
    var data : SomeObject = new SomeObject;
    var a:SomeEventDispatcher = new SomeEventDispatcher();
    a.addEventListener(Event.COMPLETE, handle(data));   
    a.dispatchCompleteEvent();
}

private function handle(data : SomeObject) : Function {
    return function(e : Event) : void {
       IEventDispatcher(e.target).removeEventListener(Event.COMPLETE, arguments.callee);
       trace(e + ", " + data);
    };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...