|
|
|||||
Прокричать событие "глобально"
Возникла бредовая идея от переизбытка лени, но всё таки спрошу, представьте что есть 10 вложенных друг в друга объектов и самый глубокий диспатчит событие, которое должен услышать самый верхний. Как то можно упростить процедуру диспатчинга или обязательно через точку указывать все объекты вглубь при подписывании объекта на слушатель?
|
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
bubble`ing?
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
а поподробнее?)
|
|
|||||
да нет, почему же?
Не так давно с этим боролся =) Есть объект "кнопка", не важно на каком она уровне, важно что она кнопка и она исполняет какое ни будь действие! Далее, к примеру, привяжем её к интерфейсу "IButton" в котором укажем для всех объектов "кнопка" метод "function onClick(ar:Function):void;". // объявим методы в классе "кнопка": function onClick(ar:Function):void { ar.call(); } // после, не важно где, можно в классе "майн" // привязав линснер к стэйджу задавать такой вопрос: function onMouse (e:MouseEvent):void { if (e.target as IButton) IButton (e.target).onClick(outPut); } // должна ответить function outPut ():void { trace("onClick"); }
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь! |
|
|||||
так что лисенер в вашем примере надо на stage подписывать или на тот объект в котором эта кнопка где то там находится?
|
|
|||||
нет, только на стэйдж.
Добавлено через 11 минут // interface ********************************************* package { /** * ... * @author estweet */ public interface InButton { function onClick(ar:Function):void; } } // class button ******************************************** package { import flash.display.Sprite; /** * ... * @author estweet */ public class MyBytton extends Sprite implements InButton { public function MyBytton() { super(); this.mouseChildren = false; var spr:Sprite = new Sprite(); spr.graphics.beginFill(0xCCCCCC); spr.graphics.drawRect(0, 0, 50, 30); addChild(spr); } /* INTERFACE tmpImage.InButton */ public function onClick(ar:Function):void { ar.call(); } } } // class main ********************************************** package { import flash.display.Sprite; import flash.events.MouseEvent; /** * ... * @author estweet */ public class TestListener extends Sprite { public function TestListener() { super(); var spr:MyBytton = new MyBytton(); spr.x = 10; spr.y = 10; addChild(spr); stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseListener); } private function onMouseListener(e:MouseEvent):void { if (e.target as InButton) InButton(e.target).onClick(outPut); } private function outPut ():void { trace("onClick!"); } } }
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь! |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
В иерархии DisplayList`а это реализовано нативно. Посмотрите второй аргумент у конструктора класса Event.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
Вообще по идее, изначально слушатели только на стэйдже приписаны а далее программисты их перенаправляют, в данном примере более удобный подход к лиснерам. Мне по затылку однажды надавали за то что я лиснеры пихал во все возможные места теперь для любого приложения мне хватает 2-3 штуки на стэйдже.
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь! |
|
|||||
[+3 18.04.11]
Регистрация: Dec 2010
Сообщений: 342
|
Цитата:
А затем в главном родительском объекте просто подписываюсь на это событие? так выходит? |
|
|||||
это событие всплывает дальше по дисплейЛисту Пока в каком-то листенере не пропишешь event.stopPropagation();
Чтоб его услышать выше надо подписаться на какой-то из родителей того кто диспатчил. например: окна, а окне панель, в панели кнопка, которая диспатчит. панель подписывается на кнопку. окно подписывается на панель а мейн подписывается на окно. и все они получают одно и то же событие.
__________________
Кто к нам с чем для чего - тот у нас того от того. |
Часовой пояс GMT +4, время: 12:43. |
|
« Предыдущая тема | Следующая тема » |
|
|