ГлавнаяActionScript 3 — «100 советов» › EventDispatcher

EventDispatcher

June 19th, 2006
В ActionScript 3 используется класс flash.events.EventDispatcher для работы с событиями (рассылка, подписка обработчиков). Одна из реализаций данного класса была доступна в ActionScript 2, но это был внешний класс, для работы с событиями в mx.* пакетах. Теперьэто встроенный класс, а значит он работает быстрее.

Кажды раз когда вы хотите обработать событие в ActionScript 3 (например “enterFrame” или “click”) вы должны использовать методы EventDispatcher.
Теперь у классов нету методов вроде onEnterFrame, onPress, onLoad.

У EventDispatcher’а есть следующие методы:

addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
Метод подписывает обработчик события.
type – Тип(имя) события
listener – ссылка на функцию – обработчика
useCapture – используется ли capture фаза или bubbles фаза.
priority – приоритет вызова обработчика
useWeakReference – использовать слабую проверку типов.

dispatchEvent(event:Event):Boolean
Метод рассылает события.
event – Экземпляр класса Event или подкласса, который будет разослан.

hasEventListener(type:String):Boolean
Проверяет есть ли обработчик события у события указанного в параметре type

removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
Удаляет обработчик событий, параметры аналогичны addEventListener

willTrigger(type:String):Boolean

Запомните, теперь в качестве слушателя выступают функции а не объекты как это было в случае с addListener.

Теперь о хорошем:
Нам больше не нужно использовать mx.utils.Delegate или подобные ему, теперь this указывает на то что надо.

У класса Event есть свойство target, которое ссылается на экземпляр который разослал событие, при использовании capture или bubble фаз, так же можно испоьзовать свойство currentTarget.

Простой пример

Код:
package { import flash.display.Sprite; import flash.events.Event; public class MyDispatcher extends Sprite { public function MyDispatcher() { addEventListener("customEvent", handleEvent); dispatchEvent(new Event("customEvent")); } private function handleEvent(event:Event):void { trace(event.type); // "customEvent" } } }

Путем расширения класса EventDispatcher или любого другого класса, который его расширяет (все DisplayObject’ы его расширяют), ваш класс получает возможность разсылать и принимать события, тоесть они могут использовать dispatchEvent и addEventListener.

Но иногда нам нужно наследовать классы, которые не расширяют EventDispatcher, в этом случае мы можем реализовать интерфейс IEventDispatcher, и создать в классе экземпляр EventDispatcher. Тоесть мы используем композицию вместо наследования.

Пример:

Код:
package { import flash.display.Sprite; import flash.events.Event; public class MyDispatcher extends Sprite { public function MyDispatcher() { var dispatcher:CustomDispatcher = new CustomDispatcher(); dispatcher.addEventListener("customEvent", handleEvent); dispatcher.dispatchEvent(new Event("customEvent")); } private function handleEvent(event:Event):void { trace(event.type); // "customEvent" } } } import flash.events.Event; import flash.events.EventDispatcher; import flash.events.IEventDispatcher; class CustomDispatcher implements IEventDispatcher { private var eventDispatcher:EventDispatcher; public function CustomDispatcher() { eventDispatcher = new EventDispatcher(this); } public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void { eventDispatcher.addEventListener.apply(null, arguments); } public function dispatchEvent(event:Event):Boolean { return eventDispatcher.dispatchEvent.apply(null, arguments); } public function hasEventListener(type:String):Boolean { return eventDispatcher.hasEventListener.apply(null, arguments); } public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void { eventDispatcher.removeEventListener.apply(null, arguments); } public function willTrigger(type:String):Boolean { return eventDispatcher.willTrigger.apply(null, arguments); } }

Класс CustomDispatcher не наследует EventDispatcher, вместо этого он реализует интерфейс IEventDispatcher и содержит в себе экземпляр EventDispatcher, который занимается работой с событиями.

Nirth: В FAQ на flasher.ru есть еще несколько статей о событиях:
Создание и рассылка собственных событий
Обработка событий

Категория: ActionScript 3 — «100 советов» Ярлыки: ,

Смотрите также

Одинаковые имена свойств События и типы событий
  1. Пока без комментариев.
  1. Пока нету.