Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   EventDispatcher - target, не понимаю (http://www.flasher.ru/forum/showthread.php?t=143001)

Psycho Tiger 04.08.2010 21:50

EventDispatcher - target, не понимаю
 
Цитата:

Целевой объект для событий, отправляемых объекту EventDispatcher. Этот параметр используется, когда экземпляр EventDispatcher агрегируется классом, внедряющим IEventDispatcher; это необходимо, чтобы содержащий его объект мог быть целью для событий.
По описанию, если я передам туда то, что реализует IEventDispatcher - это дело станет получать его события (?) что ли? Какой "внедрять" то, что уже "внедрено"? (IEventDispatcher же).

Просто не понимаю. Если не затруднит, объясните на примере. Спасибо.

GBee 05.08.2010 01:17

Пример есть прямо в хелпе, вроде все понятно сразу.

Код AS3:

package {
        import flash.events.Event;
        import flash.display.Sprite;
 
        public class IEventDispatcherExample extends Sprite {
                public function IEventDispatcherExample() {
                        var decorDispatcher:DecoratedDispatcher = new DecoratedDispatcher();
                        decorDispatcher.addEventListener("doSomething", didSomething);
                        decorDispatcher.dispatchEvent(new Event("doSomething"));
                }
 
                public function didSomething(evt:Event):void {
                        trace(">> didSomething");
                }
        }
}
 
import flash.events.IEventDispatcher;
import flash.events.EventDispatcher;
import flash.events.Event;
 
class DecoratedDispatcher implements IEventDispatcher {     
    private var dispatcher:EventDispatcher;
 
    public function DecoratedDispatcher() {
        dispatcher = new EventDispatcher(this);
    }
 
    public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void{
        dispatcher.addEventListener(type, listener, useCapture, priority);
    }
 
    public function dispatchEvent(evt:Event):Boolean{
        return dispatcher.dispatchEvent(evt);
    }
 
    public function hasEventListener(type:String):Boolean{
        return dispatcher.hasEventListener(type);
    }
 
    public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void{
        dispatcher.removeEventListener(type, listener, useCapture);
    }
 
    public function willTrigger(type:String):Boolean {
        return dispatcher.willTrigger(type);
    }
}


Wolsh 05.08.2010 01:28

Допустим тебе надо чтобы некий класс рассылал события "от своего имени", но при этом ты не можешь наследовать его от EventDispatcher (т.к. наследуешь от другого). Однако обеспечить функционал ты можешь агрегированием (композицией), заведя в этом классе встроенный объект EventDispatcher. Загвоздка только в том, что если рассылать события через него, то target у события будет ссылкой на этот объект EventDispatcher, а не на агрегат. Поскольку речь идет не столько о дисплейных объектах, то получить ссылку на сам агрегат будет затруднительно и потребует новых геттеров или особого класса события - target.parent тут не поможет. Вот для этого target и переобъявляется (хехе ну и слово). Однако нам ведь нужна уверенность, что этот новый таргет сможет полноценно прикинуться EventDispatcher - на него ведь будут вешать листенеры и т.п. Значит он обязан имплементить интерфейс IEventDispatcher.
Пример:
Код AS3:

package  
{
        import flash.events.Event;
        import flash.events.EventDispatcher;
        import flash.events.IEventDispatcher;
        import flash.events.TimerEvent;
        import flash.utils.Timer;
 
        public class IEDClass implements IEventDispatcher
        {
                private var _dispatcher:EventDispatcher;
                private var _timer:Timer = new Timer(500);
 
                public function IEDClass()
                {
                        _dispatcher = new EventDispatcher(this);
                        _timer.addEventListener(TimerEvent.TIMER, onTimer);
                        _timer.start();
                }
                private function onTimer(event:TimerEvent):void
                {
                        _dispatcher.dispatchEvent(new Event("tick"));
                }
 
                /* IEventDispatcher */
                public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false) : void
                {
                        _dispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);
                }
                public function dispatchEvent (event:Event) : Boolean
                {
                        return _dispatcher.dispatchEvent (event);
                }
 
                public function hasEventListener (type:String) : Boolean
                {
                        return _dispatcher.hasEventListener (type);
                }
 
                public function removeEventListener (type:String, listener:Function, useCapture:Boolean = false) : void
                {
                        _dispatcher.removeEventListener (type, listener, useCapture);
                }
 
                public function willTrigger (type:String) : Boolean
                {
                        return _dispatcher.willTrigger(type);
                }
 
        }
 
}

Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
 
        public class Main extends Sprite
        {
                private var _ticker:IEDClass;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        _ticker = new IEDClass();
                        _ticker.addEventListener("tick", onTick);
                }
 
                private function onTick(event:Event):void
                {
                        trace(event.target, event.currentTarget); // "[object IEDClass] [object IEDClass]"
                }
        }
 
}


Psycho Tiger 05.08.2010 11:30

GBee, мне вот и не было понятно зачем указывать target. В Вашем примере если
вместо
Код AS3:

dispatcher = new EventDispatcher(this);

сделать
Код AS3:

dispatcher = new EventDispatcher(null);

ничего бы не изменилось.

Wolsh, спасибо теперь понятно. Что то не подумал о сходстве поля target у Event`а и аргумента target у ED. :)

UPD: Ха-ха, перечитал свой вопрос. Целью читал как цепью, да и даже читая как "цель" не очень очевидно, что имеется ввиду target. Наверное, стоит читать английиский хелп.


Часовой пояс GMT +4, время: 11:59.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.