Форум 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=190873)

Tails 28.12.2012 12:54

Диспетчерезация события через EventDispatcher target
 
Есть иерархия вложенности спрайтов: a.b.c. Создаем экземпляр EventDispatcher и в target передаем спрайт c. Это получается объект, который будет получать события?

Объясните пожалуйста, почему, когда диспатчим событие, спрайт c его не получает?

Код AS3:

import flash.events.EventDispatcher;
import flash.display.Sprite;
import flash.events.Event;
 
var a:Sprite                        = new Sprite();
var b:Sprite                        = new Sprite();
var c:Sprite                        = new Sprite();
 
addChild(a);
a.addChild(b);
b.addChild(c);
 
var d:EventDispatcher        = new EventDispatcher(c);
 
a.addEventListener('customEvent',                onA);
b.addEventListener('customEvent',                onB);
c.addEventListener('customEvent',                onC);
 
 
d.dispatchEvent(new Event('customEvent', true));
 
 
 
 
function onA(e:Event):void{
        trace('Event A');
}
function onB(e:Event):void{
        trace('Event B');
}
function onC(e:Event):void{
        trace('Event C');
}

Трейс:
Цитата:

Event B
Event A

AlexLucas 28.12.2012 13:48

Потому что c диспатчит эвент. Конструктор принимает объект который имплементит IEventDispatcher, но неизвестно если наследует (не наследует) у EventDispatcher (в данном случае в этом конструкторе нет смысла т.к. спрайт наследует). Я так понял из хелпа и пары туманных объяснений :)
Т.е. этот инстанс EventDispatcher цепляется (композиция) к c, в итоге именно c диспатчит эвент.
Поправьте если неправ, тоже интересно :)

Да, e.target выдаёт [object Sprite], и это именно с (прицепил name, выдаёт его имя).

etc 28.12.2012 14:18

Меня больше удивляет сам факт того, что событие таки всплыло. Возможно это просто связано с тем, что target является DisplayObject-ом и поэтому EventDispatcher выполнил бабблинг. Ну а то, что от самого «с» не пришло событие, можно объяснить лишь тем, что у них с «d» не общие списки хендлеров (в силу того, что у него своя реализация IEventDispatcher и он не является реализатором «d» вообще).

AlexLucas 28.12.2012 14:40

Мне тяжело понять где это может пригодиться.
Ведь чтобы была польза с этого эвента, чтоб он мог всплывать, target должен быть на сцене - наследовать у DisplayObject'а, который уже наследует у EventDispatcher'a, а значит мы просто будем привязывать EventDispatcher к другому EventDispatcher'у , и тут я смысла не вижу.
Просто пытаюсь собрать пример где это может понадобиться, и не получается.

А почему событие не должно всплывать? Его же c диспатчит.

Tails 28.12.2012 14:46

AlexLucas,
И не нужно. Использовать конструктор и передавать в target имеет смысл только объекты, реализующие IE. Как написано в справке адоба, чтобы объект тоже мог получать события.

etc 28.12.2012 14:46

Ну, применение странное, безусловно.


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

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