|
|
|||||
Регистрация: Dec 2007
Сообщений: 102
|
Слушатели
как у EventDispatcher посмотреть какой стоит useCapture для определенного типа событий, и что если было вызвано 2 addEventListener с useCapture true и false
или придеться полюбому переопределять addEventListener и складывать в массив подписанных событий? типа Последний раз редактировалось CROL; 30.04.2011 в 22:33. |
|
|||||
useCapture - это свойство события, а не EventDispatcher,
проверка: Цитата:
Может попробуете обяснить что вы конкретно пытаетесь сделать? |
|
|||||
Регистрация: Dec 2007
Сообщений: 102
|
Пытаюсь сделать подобие событийной модели ДО
Сейчас у меня addEventListener выглядит так: override public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void { if(useCapture) { _useCaptureTrue = true; } else { useCaptureFalse _ = true; } if(!super.hasEventListener(type)) { super.addEventListener(type, listener, false, priority, useWeakReference); } } Что лучше использовать чтоб было правильней? У меня сейчас мозги смотрят в сторону массива, но может есть идеи получше? |
|
|||||
Если оставить вопрос "А зачем нужна фаза захвата для невизуальных объектов?"
Главная идея: capture или не capture - это всетки свойство "подписанного слушателя" (я был не прав с событием - у него оно как-бы меняется, как-бы - потому-что событие клонируется) Поэтому не знаю как вам поможет массив, в котором нет информации о функциях-слушателях Значит надо: - связать useCapture со слушателем - помнить что тот же слушатель может подписаться еще и через useCapture == false; Сделать поле в listener с названием useCapture мы физически не можем. Значит надо замепить useCapture по ключу-слушателю, например так: private var _listenerAddedAsUseCapture:Dictionary = new Dictionary(); private var _listenerAddedAsNotUseCapture:Dictionary = new Dictionary(); override public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void { if(useCapture) { _listenerAddedAsUseCapture[listener] = listener; } else { _listenerAddedAsNotUseCapture[listener] = listener; } } // При имуляции фазы захвата event.eventPhase == EventPhase.CAPTURING_PHASE;// read-only - чтобы стало не рид-онли, видимо, придется расширить класс Event и использовать только собственне эвенты или забить на это поле for each (var listener:Function in _listenerAddedAsUseCapture) { listener(event); } // При диспетчинге фазы всплытия for each (var listener:Function in _listenerAddedAsNotUseCapture) { listener(event); } override public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void { if(useCapture) { _captureEventDispatcher.addEventListener(type, listener, true, 0, useWeakReference); } else { _normalEventDispatcher.addEventListener(type, listener, false, 0, useWeakReference); } } // При имуляции фазы захвата _captureEventDispatcher.dispatch(event); // При диспетчинге фазы всплытия _normalEventDispatcher.dispatch(event); _normalEventDispatcher - это тоже наша реализация, которая будет эмулировать фазу всплытия Теоретически так должно быть меньше каши в коде Но "В теории теория и практика не разделимы - на практике это не совсем так" Последний раз редактировалось expl; 01.05.2011 в 00:49. |
|
|||||
strange mood
|
Цитата:
Цитата:
Цитата:
__________________
тонкий тролль, осеянный благодатью |
Часовой пояс GMT +4, время: 20:52. |
|
« Предыдущая тема | Следующая тема » |
|
|