![]() |
|
||||||||||
|
|
|
|||||
|
Возникла бредовая идея от переизбытка лени, но всё таки спрошу, представьте что есть 10 вложенных друг в друга объектов и самый глубокий диспатчит событие, которое должен услышать самый верхний. Как то можно упростить процедуру диспатчинга или обязательно через точку указывать все объекты вглубь при подписывании объекта на слушатель?
|
|
|||||
|
bubble`ing?
![]()
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
а поподробнее?)
|
|
|||||
|
В иерархии DisplayList`а это реализовано нативно. Посмотрите второй аргумент у конструктора класса Event.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Регистрация: Dec 2010
Сообщений: 342
|
Цитата:
А затем в главном родительском объекте просто подписываюсь на это событие? так выходит? |
|
|||||
|
По идее, да.
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку. |
|
|||||
|
да нет, почему же?
Не так давно с этим боролся =) Есть объект "кнопка", не важно на каком она уровне, важно что она кнопка и она исполняет какое ни будь действие! Далее, к примеру, привяжем её к интерфейсу "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 подписывать или на тот объект в котором эта кнопка где то там находится?
|
|
|||||
|
Вообще по идее, изначально слушатели только на стэйдже приписаны а далее программисты их перенаправляют, в данном примере более удобный подход к лиснерам. Мне по затылку однажды надавали за то что я лиснеры пихал во все возможные места теперь для любого приложения мне хватает 2-3 штуки на стэйдже.
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь! |
|
|||||
|
нет, только на стэйдж.
Добавлено через 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!"); } } }
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь! |
![]() |
![]() |
Часовой пояс GMT +4, время: 16:31. |
|
|
« Предыдущая тема | Следующая тема » |
|
|