Показать сообщение отдельно
Старый 01.10.2006, 00:52
Nirth вне форума Посмотреть профиль Отправить личное сообщение для Nirth Посетить домашнюю страницу Nirth Найти все сообщения от Nirth
  № 17  
Ответить с цитированием
Nirth
4AM Games
 
Аватар для Nirth

блогер
Регистрация: Nov 2002
Адрес: Sofia
Сообщений: 6,264
Записей в блоге: 1
Отправить сообщение для Nirth с помощью ICQ Отправить сообщение для Nirth с помощью AIM Отправить сообщение для Nirth с помощью MSN Отправить сообщение для Nirth с помощью Yahoo Отправить сообщение для Nirth с помощью Skype™
В 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 есть еще несколько статей о событиях:
Создание и рассылка собственных событий
Обработка событий
__________________
Я перестал переписывать, начал редактировать, еще лет 15 и я стану писателем ^_^