Глобальный бродкастер
просто обертка для статического eventDispatcher'а
идея заключается в том, чтобы рассылать события не напрямую подписчикам или через баблинг, а через глобального посредника.
резоны:
1. можно быть уверенным, что получатель обязательно получит сообщение, незавсимо от его его положения в иерархии приложения, к примеру переехал он в другого родителя и уже никогда не дождется никакого всплывающего евента, а такой получит по-любому.
2. для не визуальных объектов или 'прямой' подписки нет нужды городить систему обмена ссылками, каждый сам может подписаться на нужные ему рассылки.
3. возможность блокировать/разблокировать рассылку событий определенного типа (или вообще всех), к примеру не надо мне, чтобы в какой-то момент срабатывали триггеры свойств модели, ну и пожалуйста: блокируем не угодные рассылки, когда надо будет включим снова.
минусы:
каких-то граблей в таком решении я пока не вижу, хотя и не слишком обольщаюсь, что их вовсе нет
не берусь судить насколько такой подход годится для серьезных вещей, но для сольных проектов я нашел его очень даже комфортным.
реализация:
package silin.utils { import flash.events.*; /** * Broadcaster <br/> * статический диспатчер для глобального вещания событий * * @author silin */ public class Broadcaster { public static const ALL_EVENTS:String = "*"; private static const _DISPATCHER : EventDispatcher = new EventDispatcher(); private static var _permittances:Object = { }; /** * there's no constructor */ public function Broadcaster() { trace("Broadcaster is a static class and should not be instantiated."); } /** * рассылает событие * @param event рассылаемое событие * @return true если событие разослано */ public static function broadcastEvent(event:Event):Boolean { return _permittances[event.type] ? _DISPATCHER.dispatchEvent(event) : false; } /** * добавляет литенер в список глобального вещания * @param type тип события * @param listener метод, обрабатывающий событие * @param priority приоритет листенера * @param useWeakReference использовать ли мягкие ссылки */ public static function addEventListener(type:String, listener:Function, priority:int = 0, useWeakReference:Boolean = false): void { _permittances[type] = true; //useCapture всегда false _DISPATCHER.addEventListener(type, listener, false, priority, useWeakReference); } /** * удаляет листенер их списка глобального вещания * @param type тип события * @param listener удаляемый листенер */ public static function removeEventListener(type:String, listener:Function): void { _DISPATCHER.removeEventListener(type, listener, false); if (!hasEventListener(type)) { delete _permittances[type]; } } /** * проверяет есть ли листенеры указанного типа * @param type тип события * @return true, если есть листенеры, слушающие такой тип */ public static function hasEventListener(type:String): Boolean { return _DISPATCHER.hasEventListener(type); } /** * блокирует расссылку событий указанного типа * @param type тип события */ public static function lock(type:String=ALL_EVENTS):void { if (type == ALL_EVENTS) { for (var key:String in _permittances) { _permittances[key] = false; } }else { _permittances[type] = false; } } /** * разблокирует расссылку событий указанного типа * @param type тип события */ public static function unlock(type:String=ALL_EVENTS):void { if (type == ALL_EVENTS) { for (var key:String in _permittances) { _permittances[key] = true; } }else { _permittances[type] = true; } } } }
Всего комментариев 16
Комментарии
07.07.2009 19:27 | |
Посмотри, как это в MATE сделано Смотри, можно ж в качестве глобального диспатчера использовать уже готовый диспатчер, мало того, слушающий всплывающие события тоже.
|
25.10.2009 12:07 | |
ага, согласен dispatchEvent здесь уместнее, чем broadcastEvent
сам не пойму теперь почему так обозвал |
25.10.2009 17:33 | |
27.10.2009 12:23 | |
Цитата:
т.к. компилится быстрее, и тебе советую.
|
27.10.2009 19:15 | |
чуть больше, чем на микрон
На самом деле, разницы для компилирующих флекс сдк ноль. Для компилирующих через флеш иде - она весьма ощутима. |
|
Обновил(-а) Psycho Tiger 27.10.2009 в 19:21
|
27.10.2009 21:09 | |
Тигр, ты давно тут видел людей, компилирующих через флеш иде ?
пусть уж все останутся при своих предпочтениях в организации импортов мне лично очень по душе новая (не осознал в какой версии появилась) фича FD Refactor-Truncate Imports а еще AutoFormat / Indent Plugin косит неиспользуемые импорты - мелочь, а как душевно |
28.10.2009 20:48 | |
Ну, например у меня в универе на машинах стоят флеш идехи, а флексовых нету
пожалуй, насчет предпочтений - ты прав, оставим всё как есть.) |
29.10.2009 13:34 | |
Цитата:
Refactor-Truncate Imports
|
01.11.2009 20:34 | |
FD3.0.5
правая кнопка - Refactor.. |
02.11.2009 13:22 | |
Цитата:
FD3.0.5
правая кнопка - Refactor.. |
02.11.2009 20:57 | |
не, плагин мне тоже не пошел
речь о встроенной фиче, кстати в той же ветке в самом конце Мика о ней упоминает |
02.11.2009 23:15 | |
Так там говорится о наличии этой фичи в рабочей сборке, а в релиз этого видимо не попало, тк у меня этого нет.
|
03.11.2009 01:12 | |
ага, но у меня сейчас тоже стоит 3.0.5 RTM, но ставил поверх того что было (а были и промежуточные сборки), может в этом фокус
|
Последние записи от silin
- Equalizer (22.06.2011)
- WaveSynthesizer (05.04.2011)
- ToneGenerator (31.03.2011)
- 3D фреймворк (24.10.2009)
- Глобальный бродкастер (04.07.2009)