![]() |
|
||||||||||
|
|||||
|
[+ 1.0 08.10.14]
блогер
Регистрация: Mar 2010
Адрес: x = stage.stageWidth/2 y= stage.stageHeight/2
Сообщений: 293
Записей в блоге: 2
|
Требуется написать универсальную функцию, которая отписывает объект от каких либо оповещений. Можно ли это сделать каким то стандартным образом. Быть может есть какой то список с событиями, на который подписался объект. Или придется тупо спрашивать его о листенерах через hasEventListener ?!
|
|
|||||
|
hasEventListener бесполезен, он только скажет, что обработчик есть.
В отписке нужно указывать не только тип, но и обработчик события, а для всплывающих ещё и флаг перехвата. Список есть, но доступа к нему нет ![]() Нативных решений нет но есть различные менеджеры событий, работающие через наследование, композицию или как глобальные. |
|
|||||
|
[+ 1.0 08.10.14]
блогер
Регистрация: Mar 2010
Адрес: x = stage.stageWidth/2 y= stage.stageHeight/2
Сообщений: 293
Записей в блоге: 2
|
Есть такая функция describeType, которая возвращает xml описание объекта. Я ее использовал, чтобы обходить свойства экземпляров классов, потому, что не все экземпляры можно обойти с помощью цикла for. Может быть в нем есть этот лист ?
Добавлено через 1 час 26 минут Вообщем с помощью метода flash.sampler.getMemberNames удалось добраться до массива с листенерами: public static function removeAllListeners (object:Object) :void { var members:Object = getMemberNames(object); for each (var prop:QName in members) { if (prop.localName == 'listeners') { var arr:Array = object[prop]; } } } Грубо говоря есть функция, нужно вытащить тип принимаемого параметра. Добавлено через 11 часов 38 минут заебался рыться, пришлось написать свой спрайт package presentsimple.display { import flash.display.Sprite; /** * ... * @author sergey kostin (inozemcev); */ public class Sprite extends flash.display.Sprite { private var _listeners:Vector.<EventDispatcherItem>; override public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void { var item:EventDispatcherItem = new EventDispatcherItem (type, listener, useCapture); listeners.push (item); super.addEventListener(type, listener, useCapture, priority, useWeakReference); } override public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void { super.removeEventListener(type, listener, useCapture); var item:EventDispatcherItem = getListener (type, listener, useCapture); if (item) { listeners.splice (listeners.indexOf(item), 1); } } private function get listeners () :Vector.<EventDispatcherItem> { if (!_listeners) _listeners = new Vector.<EventDispatcherItem> (); return _listeners; } public function removeTypeListeners (type:String) :void { for each (var handler:EventDispatcherItem in listeners) { if (handler.type == type) { removeEventListener (handler.type, handler.listener, handler.useCapture) } } } public function removeAllListeners () :void { while (listeners.length) { var handler:EventDispatcherItem = listeners.shift (); removeEventListener (handler.type, handler.listener, handler.useCapture) } } private function getListener (type:String, listener:Function, useCapture:Boolean = false):EventDispatcherItem { var item:EventDispatcherItem; for each (var handler:EventDispatcherItem in listeners) { if (handler.type == type && handler.listener == listener && handler.useCapture == useCapture) { item = handler; return item; } } return item; } } public class EventDispatcherItem { public var type:String; public var listener:Function; public var useCapture:Boolean; public function EventDispatcherItem(type:String, listener:Function, useCapture:Boolean) { this.type = type; this.listener = listener; this.useCapture = useCapture; } } } Последний раз редактировалось inozemcev; 31.10.2010 в 04:57. |
![]() |
![]() |
Часовой пояс GMT +4, время: 23:58. |
|
|
« Предыдущая тема | Следующая тема » |
|
|