Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Реализация всплытия для не DisplayObject (http://www.flasher.ru/forum/showthread.php?t=152575)

expl 20.03.2011 14:35

Цитата:

Сообщение от etc (Сообщение 982072)
Код AS3:

var e:Event = new Event(Event.COMPLETE);
var s:Sprite = new Sprite();
super.addEventListener(Event.COMPLETE, handler);
s.addEventListener(Event.COMPLETE, handler2);
 
function handler(event:Event):void {
        trace(e === event, event.target); // true [object MainTimeline]
        s.dispatchEvent(event);
}
 
function handler2(event:Event):void {
        trace(e === event, event.target); // false, [object Sprite]
}
 
super.dispatchEvent(e);


Ну так это же дисплей-объекты, а в моём подходе вручную перенаправляем и дисплей-объектов там нет
Топик всёта-ки "Реализация всплытия для не DisplayObject " называется

А вообще, если currentTarget эмулировать, то клонировать надо-бы и этот currentTarget выставлять

etc 20.03.2011 14:47

Это не принципиально DisplayObject или нет. Если хочется повторить, то надо, чтобы не клонировалось при всплытии :)

expl 20.03.2011 16:17

Ничего не понял.
Попробую задать вопрос по другому: Что надо сделать "Если хочется повторить" и при этом "чтобы не клонировалось при всплытии"?

scarbo 20.03.2011 16:17

Да, currentTarget тоже нужны. Etc, ты раньше писал, что в вашем MVC используется своя система всплытия как раз, не поделишься?

etc 20.03.2011 16:24

scarbo, боюсь, что сейчас это собственность Mail.Ru Group, к которой я отношения никакого не имею.
Кажется, там тоже клонируется событие при всплытии, но точно об этом знает Блуд.

scarbo 20.03.2011 16:27

Ясно, спасибо. Я просто помню ты выкладывал картиночку, где всякие кружочки рисовал взаимосвязи, и там тебя еще спросили, типа как события организованы, на displayobject?ты ответил, что не дай бог. Вот у меня сейчас такая же ситуация.:)

expl 20.03.2011 16:27

Действительно, видимо криво в первый раз проверил, клонируется (не сказал бы что это проблема, но всё же):

Код AS3:

                public function Main():void 
                {
                        var parent:EventDispatcherWithBubbles = new EventDispatcherWithBubbles("parent");
                        var child:EventDispatcherWithBubbles = new EventDispatcherWithBubbles("child");
                        child.eventParent = parent;
 
                        parent.addEventListener(Event.CHANGE, onParentChange);
                        child.addEventListener(Event.CHANGE, onChildChange);
 
                        _event = new Event(Event.CHANGE);
                        child.dispatchEvent(_event);
                }
 
                private var _event:Event;
 
                private function onParentChange(event:Event):void
                {
                        trace("onParentChange:" + event.target);
                        trace("onChildChange: _event == event:" + (_event == event));
                }
 
                private function onChildChange(event:Event):void
                {
                        trace("onChildChange:" + event.target);
                        trace("onChildChange: _event == event:" + (_event == event));
                }

Вывод:
Код:

onChildChange:child
onChildChange: _event == event:true
onParentChange:parent
onChildChange: _event == event:false

Ну не реализовывать же из-за этого механику event-диспетчера вручную.
Более острая проблема - это то что при таком подходе нельзя верить target.
currentTarget вроде правильно всё выдает.

При необходимости придется перегружать target в классе события и присваивать вручную (мне не требовалось просто - обычно таргет в типизированное поле события себя записывает при отправке события)

etc 20.03.2011 16:30

Ну хотя бы target надо сохранить. Уж с клонированием как-нибудь потом. Либо вообще реализовывать свой EventDispatcher, но есть подозрение, что он будет медленным.

Добавлено через 1 минуту
scarbo, да можно и DisplayObject, Димарик например не против совершенно и оно вроде как даже быстрее, правда памяти больше жрёт. Только вот идеологически не очень.

Zebestov 20.03.2011 16:36

Вот здесь Event, в котором при клонировании target тянется от первоисточника.

Psycho Tiger 20.03.2011 18:41

Спросите у dimarik`а. Он мне показывал реализацию своего композитного ED и там, хоть всё достаточно понятно и логично, но очень круто. Кстати, его код распространяется (распространяется ли?) по лицензии MIT.
Мои размышления, когда я сам пытался это сделать (это часть переписки между мной и Димкой, кстати. Надеюсь, он не расстроится что кусок личной переписки выкладываю сюда):
Цитата:

Делаю полную аналогию DisplayObjectContainer (для всплытия баббла), наследуюсь от EventDispatcher. Проще говоря делаю Composite.
Бабблинг не вызывает проблем, обычный редиспатч по родителям.
Бабблю я обёртку над Event, переопределив там методы stopPropogation, stopImmediatlyPropogation, в которых меняю флаги. Если событие было остановлено, то бабблинг останавливается. preventDefault я реализовал так:

Код AS3:

preventedDefault = preventedDefault || !parent.$dispatchEvent(compositeEvent);

После возвращаю !preventDefault от моего переопределенного метода dispatchEvent.
С currentTarget у Event`а в обработчиках думать не надо: он вполне правильно ведёт себя нативно. Из за невозможности создать capture фазу с eventPhase тоже всё просто:

Код AS3:

override public function get eventPhase():uint {
        if (!super.bubbles) return super.eventPhase;
        return eventTarget === currentTarget ? EventPhase.AT_TARGET : EventPhase.BUBBLING_PHASE;
}

eventTarget — это аналог Event#target. Мои наблюдения таковы, что в EventDispatcher#dispatchEvent, если у Event установлен target происходит клонирование события. В своём переопределенном dispatchEvent я клонировал событие сам, назначая ему target. Это порождает проблему: я могу передавать в клон старый target, но событие будет клонироваться дважды, что неприемлемо по производительности. Поэтому я был вынужден создать своё поле eventTarget.
Дмитрий обошёл эту проблему.


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

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