![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
|
Как можно реализовать систему всплытия для не DisplayObject? Конкретно интересует такой момент:
Есть иерархия объектов с 3-4 уровневой вложенностью, необходимо, чтобы родитель мог подписаться на события "внуков" и "правнуков".
__________________
Я просто добрый шутник. |
|
|||||
|
Регистрация: Jun 2008
Адрес: курский вокзал
Сообщений: 1,114
|
Сейчас так и сделано.Тогда так, это единственный путь решения?Родитель подписывается на ребенка и шлет выше. Я просто не знаю, как устроен этот механизм в DisplayObject, где бы почитать про это.
__________________
Я просто добрый шутник. |
|
|||||
|
Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
|
Можно создать массив в котором хранятся ссылки на объекты всей ветки, от корня до конца. В переопределенном методе dispatchEvent при bubbles=true обходится массив начиная от event.target и диспатчится тоже событие.
|
|
|||||
|
Какой массив? Зачем массив?
наследуем детей от этого кода вместо EventDispatcher-а и при добавлении в невизуальный контейнер выставляем у них eventParent на этот контейнер - при удалении зануляем 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; } } } Последний раз редактировалось expl; 20.03.2011 в 14:40. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
expl, в таком варианте событие будет клонироваться при каждом dispatchEvent.
|
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
я делал
уже опередили, пока писал. Цитата:
должен ведь смениться currentTarget
__________________
Отряд Котовскага Последний раз редактировалось Котяра; 20.03.2011 в 14:28. |
|
|||||
|
Цитата:
Да, кстати currentTarget в моём подходе вообще не учитывается - без него как-то обходился Проверил, НЕ клонируется. 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");// НЕ падает } } } } Последний раз редактировалось expl; 20.03.2011 в 14:33. |
|
|||||
|
буду краток
модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
|
Если у события не совпадает хозяин и корреспондент - то при рассылке клонируется вроде.
__________________
Отряд Котовскага |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
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, время: 10:14. |
|
|
« Предыдущая тема | Следующая тема » |
|
|