Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Слушатели (http://www.flasher.ru/forum/showthread.php?t=155262)

CROL 30.04.2011 22:13

Слушатели
 
как у EventDispatcher посмотреть какой стоит useCapture для определенного типа событий, и что если было вызвано 2 addEventListener с useCapture true и false

или придеться полюбому переопределять addEventListener и складывать в массив подписанных событий? типа
Код AS3:

array.push([type, useCaptureTrue, useCaptureFalse]);


expl 30.04.2011 22:56

useCapture - это свойство события, а не EventDispatcher,
проверка:
Код AS3:

if (event.eventPhase == EventPhase.CAPTURING_PHASE) {...}

Цитата:

что если было вызвано 2 addEventListener с useCapture true и false
один раз событие перехватится в фазе захвата - второй в фазе всплытия.

Может попробуете обяснить что вы конкретно пытаетесь сделать?

CROL 30.04.2011 23:18

Цитата:

Сообщение от expl (Сообщение 993042)
Может попробуете обяснить что вы конкретно пытаетесь сделать?

Пытаюсь сделать подобие событийной модели ДО
Сейчас у меня addEventListener выглядит так:
Код AS3:

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);
                        }
                }

Естественно это ни в какие ворота, щас есть просто глобальные useCaptureTrue и useCaptureFalse для любого вида событий..
Что лучше использовать чтоб было правильней? У меня сейчас мозги смотрят в сторону массива, но может есть идеи получше?

expl 01.05.2011 00:43

Если оставить вопрос "А зачем нужна фаза захвата для невизуальных объектов?"

Главная идея: 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 - это тоже наша реализация, которая будет эмулировать фазу всплытия

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

Gaen 01.05.2011 01:41

Цитата:

Что если было вызвано 2 addEventListener с useCapture true и false?
Цитата:

Keep in mind that after the listener is registered, subsequent calls to addEventListener() with a different type or useCapture value result in the creation of a separate listener registration. For example, if you first register a listener with useCapture set to true, it listens only during the capture phase. If you call addEventListener() again using the same listener object, but with useCapture set to false, you have two separate listeners: one that listens during the capture phase and another that listens during the target and bubbling phases.
Цитата:

Как у EventDispatcher посмотреть какой стоит useCapture для определенного типа событий?
Стандартными средствами - никак, к сожалению. Придется перекрывать addEventListener и removeEventListener, чтобы запоминать и удалять информацию о слушателях. Причем это весьма обидно, так как оригинальные методы делают абсолютно то же самое, но используют хранилище, недоступное для пользовательского кода.


Часовой пояс GMT +4, время: 02:05.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.