Тема: Слушатели
Показать сообщение отдельно
Старый 01.05.2011, 00:43
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 4  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Если оставить вопрос "А зачем нужна фаза захвата для невизуальных объектов?"

Главная идея: capture или не capture - это всетки свойство "подписанного слушателя" (я был не прав с событием - у него оно как-бы меняется, как-бы - потому-что событие клонируется)

Поэтому не знаю как вам поможет массив, в котором нет информации о функциях-слушателях

Значит надо:
- связать useCapture со слушателем
- помнить что тот же слушатель может подписаться еще и через useCapture == false;

Сделать поле в listener с названием useCapture мы физически не можем.
Значит надо замепить useCapture по ключу-слушателю, например так:
Код AS3:
    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);
                }
Может прокатит вариант по-красивее (может удобнее будет рулить 2-мя внутренними диспетчерами, видимо, собственной реализации):
Код AS3:
                 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);
_captureEventDispatcher - это наша реализация, которая будет эмулировать фазу захвата
_normalEventDispatcher - это тоже наша реализация, которая будет эмулировать фазу всплытия

Теоретически так должно быть меньше каши в коде
Но
"В теории теория и практика не разделимы - на практике это не совсем так"


Последний раз редактировалось expl; 01.05.2011 в 00:49.