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

scarbo 20.03.2011 01:30

Реализация всплытия для не DisplayObject
 
Как можно реализовать систему всплытия для не DisplayObject? Конкретно интересует такой момент:
Есть иерархия объектов с 3-4 уровневой вложенностью, необходимо, чтобы родитель мог подписаться на события "внуков" и "правнуков".

КорДум 20.03.2011 01:37

Дедушка слушает сына, сын слушает своего сына?

scarbo 20.03.2011 01:40

Сейчас так и сделано.Тогда так, это единственный путь решения?Родитель подписывается на ребенка и шлет выше. Я просто не знаю, как устроен этот механизм в DisplayObject, где бы почитать про это.

Bgg 20.03.2011 01:53

Можно создать массив в котором хранятся ссылки на объекты всей ветки, от корня до конца. В переопределенном методе dispatchEvent при bubbles=true обходится массив начиная от event.target и диспатчится тоже событие.

expl 20.03.2011 13:53

Какой массив? Зачем массив?

наследуем детей от этого кода вместо EventDispatcher-а и при добавлении в невизуальный контейнер выставляем у них eventParent на этот контейнер - при удалении зануляем

Код AS3:

package
{
        import flash.events.Event;
        import flash.events.EventDispatcher;
        import flash.events.IEventDispatcher;
 
        public class EventDispatcherWithBubbles extends EventDispatcher
        {
                protected var _eventParent:IEventDispatcher;
 
                public function EventDispatcherWithBubbles()
                {
                      super(this);
                }
 
                public function set eventParent(value:IEventDispatcher):void
                {
                        _eventParent = value;
                }
 
                public function get eventParent():IEventDispatcher
                {
                        return _eventParent;
                }
 
                override public function dispatchEvent(event:Event):Boolean
                {
                        var dispatchResult:Boolean = super.dispatchEvent(event);
                        if (_eventParent != null)
                        {
                                _eventParent.dispatchEvent(event);
                        }
                        return dispatchResult;
                }
        }
}

В контейнере детей можно еще рассылать события ADDED и REMOVED при необходимости

etc 20.03.2011 14:09

expl, в таком варианте событие будет клонироваться при каждом dispatchEvent.

Котяра 20.03.2011 14:12

я делал
Код AS3:

if(parent && event.bubbles)
parent.dispatchEvent(event)

уже опередили, пока писал.
Цитата:

в таком варианте событие будет клонироваться при каждом dispatchEvent.
А в чём проблема?
должен ведь смениться currentTarget

expl 20.03.2011 14:20

Цитата:

expl, в таком варианте событие будет клонироваться при каждом dispatchEvent.
Разве при вызове dispatchEvent оно клонируется. Это какая-то ерунда получается:
Код AS3:

dispatchEvent(new Event(Event.CHANGE));// Один раз создали и еще один раз склонировали?

Да, кстати currentTarget в моём подходе вообще не учитывается - без него как-то обходился

Проверил, НЕ клонируется.

Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.errors.IllegalOperationError;
        import flash.events.Event;
        import flash.events.EventDispatcher;
 
        public class Main extends Sprite
        {
 
                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);
                        // entry point
 
                        var object0:EventDispatcherWithBubbles = new EventDispatcherWithBubbles();
                        var object1:EventDispatcherWithBubbles = new EventDispatcherWithBubbles();
                        object1.eventParent = object0;
 
                        object0.addEventListener(Event.CHANGE, onChange);
                        _event = new Event(Event.CHANGE);
                        object1.dispatchEvent(_event);
                }
 
                private var _event:Event;
 
                private function onChange(event:Event):void
                {
                        if (_event !== event)
                        {
                                throw new Error("_event mast be equals event");// НЕ падает
                        }
                }
        }
 
}


Котяра 20.03.2011 14:25

Если у события не совпадает хозяин и корреспондент - то при рассылке клонируется вроде.

etc 20.03.2011 14:31

Код 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);



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

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