Централизованная обработка событий
Приветствую. Возник вопрос по централизованной обработке кастомных событий.
Свои события собираю в статику: AppEvents.APP_EVENT_1 = "1" AppEvents.APP_EVENT_2 = "2" Структура программы типа "Звезда" - все события обрабатываются Контроллером: Код:
СубКласс6 СубКласс5 Вопрос: как в Контроллере не цеплять персональный слушатель для каждого app-события, а слушать любое из доступных в AppEvents-классе. Код AS3:
Код AS3:
|
А так разве можно?
По идее, то, что вы хотите, можно реализовать, передавая в общем событии AppEvents.APP_EVENT параметром идентификатор таргета. Код AS3:
|
Цитата:
И вообще лучше не использовать вот таких глобальных диспетчеров |
Хорошо, если у меня десятки кастомных событий...
Код:
Пример "Изменение языка интерфейса": |
Какое отношение Модель имеет к интерфейсу пользователя? О__о
Добавлено через 3 минуты Ааа.. так это не MVC похоже... Тут зачем-то КОнтроллер слушает события Модели и вызывает методы Вью, то есть все шиворот-навыворот. |
Ок, неудачный пример мешает ответить на мой вопрос. Давайте еще проще..
Когда я говорю, что мне нужно, неважно зачем, прицепить на кнопку все маус-события вот так: Код AS3:
|
Даже этот код неправильный, потому что e:MouseEvent, а в свитче у Вас switch(e), но case MouseEvent.CLICK (а это просто Стринг).
Попробую проще. Такого синтаксиса не существует в принципе: MouseEvent.* То есть вообще в языке нет такого. То, что Вам хочется, решается очень просто и Вам уже объяснили, как. То, что Вы пытаетесь заменить конструкцией MouseEvent.* — это просто строка. Это не событие, не его класс. Просто строка типа "click". Поэтому Вы смело можете диспатчить события ОДНОГО Типа ("тип" это как раз данная строка), но завести в своем AppEvents СВОЕ свойство, заменяющее Тип, например eventType:String, и задавать этот свой тип событиям перед диспатчем, а затем в свитче разбирать, что это пришло, не по event.type, а по своему event.eventType. Так понятней? |
Благодарю.
Извиняюсь, не понял вот это: Цитата:
Цитата:
Добавлено через 24 минуты T.e тип сообщения будет всегда один APP_EVENT, на него я подписываюсь в Контроллере. Но при диспатче мне нужно дополнительно передавать, скажем еще 2 параметра - id источника сообщения и msg c названием события и уже e.id и e.msg проверять в swich'е? Добавлено через 32 минуты Дошло, спасибо =) |
Да не, не таргета. Хотя, в абстрактном смысле можно и так сказать. Имелось ввиду именно указатель, по которому можно идентифицировать что за событие, раз уж .type у всех одинаковый.
Вы подписываетесь на один Тип события — AppEvents.APP_EVENT. Это выражение — просто строковая константа, просто строка. Это может быть просто "а" например. Такой вот код будет работать Код AS3:
Тут надо понять только одну важную вещь: addEventListener() не интересуется, какого класса Событие надо "ловить". Его интересует только строка. Класс же События указывается только в приемнике обработчика, и если придет событие с типом "а", но не того класса, на который настроен обработчик, случится беда. Итак, чтобы ловить ВСЕ события класса AppEvents, нужно подписаться на один тип и ловить их в обработчик, настроенный на AppEvents. Но Вам же нужны РАЗНЫЕ типы событий, чтобы понимать что именно случилось. Эти же константы, которые Вы уже (видимо) завели в своем классе AppEvents, Вы можете использовать для другого свойства. Это свойство нужно ДОБАВИТЬ в класс события AppEvents. Например, добавляем свойство eventType: Код AS3:
Код AS3:
|
Да, так я себе это и понял. Еще раз спасибо за ваше терпение =)
Добавлено через 15 минут Не понял еще: Цитата:
В моем понимании Контроллер на то и К., чтобы дергать в нужный момент кого нужно, а остальные классы между собой не общаются на прямую.. это уменьшает количество взаимных связей, а умные книги говорят, что это хорошо =) |
Часовой пояс GMT +4, время: 01:01. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.