|
|
|||||
Регистрация: Oct 2015
Сообщений: 32
|
Централизованная обработка событий
Приветствую. Возник вопрос по централизованной обработке кастомных событий.
Свои события собираю в статику: AppEvents.APP_EVENT_1 = "1" AppEvents.APP_EVENT_2 = "2" Структура программы типа "Звезда" - все события обрабатываются Контроллером: Для приема-передачи событий используется глобальный диспатчер (GlobalDispatcher). Субклассы используют его статический метод для отправки, Контроллер использует его для приема событий. Вопрос: как в Контроллере не цеплять персональный слушатель для каждого app-события, а слушать любое из доступных в AppEvents-классе. //Соntroller GlobalDispatcher.addEventListener(AppEvents.*, appEventManager); .. .. private function appEventManager(e:AppEvents):void { swith(e): case "1": doSome1(); break; case "2": doSome2(); break; .. } Последний раз редактировалось 0l3; 23.12.2017 в 16:52. |
|
|||||
А так разве можно?
По идее, то, что вы хотите, можно реализовать, передавая в общем событии AppEvents.APP_EVENT параметром идентификатор таргета.
__________________
while(live()) { hope(); } |
|
|||||
Цитата:
И вообще лучше не использовать вот таких глобальных диспетчеров
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Регистрация: Oct 2015
Сообщений: 32
|
Хорошо, если у меня десятки кастомных событий...
Пример "Изменение языка интерфейса": Вивер: [событие] Пользователь изменил язык интерфейса (комбобокс = "ru") Контроллер: Модель - загрузи файл ("ru")-языка локали! Модель: [событие-реакция] Файл локали загрузил. Данные в паблик-контейнере. Контроллер: Вивер - обнови UI! Используй такие данные (Модель.контейнерСтринговЛокали) Вивер: [событие-реакция] UI обновил успешно. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Какое отношение Модель имеет к интерфейсу пользователя? О__о
Добавлено через 3 минуты Ааа.. так это не MVC похоже... Тут зачем-то КОнтроллер слушает события Модели и вызывает методы Вью, то есть все шиворот-навыворот.
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Oct 2015
Сообщений: 32
|
Ок, неудачный пример мешает ответить на мой вопрос. Давайте еще проще..
Когда я говорю, что мне нужно, неважно зачем, прицепить на кнопку все маус-события вот так: .. вы говорите, что в AS3 это сделать нельзя.. Последний раз редактировалось 0l3; 23.12.2017 в 22:02. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Даже этот код неправильный, потому что e:MouseEvent, а в свитче у Вас switch(e), но case MouseEvent.CLICK (а это просто Стринг).
Попробую проще. Такого синтаксиса не существует в принципе: MouseEvent.* То есть вообще в языке нет такого. То, что Вам хочется, решается очень просто и Вам уже объяснили, как. То, что Вы пытаетесь заменить конструкцией MouseEvent.* — это просто строка. Это не событие, не его класс. Просто строка типа "click". Поэтому Вы смело можете диспатчить события ОДНОГО Типа ("тип" это как раз данная строка), но завести в своем AppEvents СВОЕ свойство, заменяющее Тип, например eventType:String, и задавать этот свой тип событиям перед диспатчем, а затем в свитче разбирать, что это пришло, не по event.type, а по своему event.eventType. Так понятней?
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Oct 2015
Сообщений: 32
|
Благодарю.
Извиняюсь, не понял вот это: Цитата:
Цитата:
Добавлено через 24 минуты T.e тип сообщения будет всегда один APP_EVENT, на него я подписываюсь в Контроллере. Но при диспатче мне нужно дополнительно передавать, скажем еще 2 параметра - id источника сообщения и msg c названием события и уже e.id и e.msg проверять в swich'е? Добавлено через 32 минуты Дошло, спасибо =) Последний раз редактировалось 0l3; 23.12.2017 в 22:24. |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Да не, не таргета. Хотя, в абстрактном смысле можно и так сказать. Имелось ввиду именно указатель, по которому можно идентифицировать что за событие, раз уж .type у всех одинаковый.
Вы подписываетесь на один Тип события — AppEvents.APP_EVENT. Это выражение — просто строковая константа, просто строка. Это может быть просто "а" например. Такой вот код будет работать То есть этот параметр type никак не связан с самим классом События. То, что принято его хранить в виде константы в классе События, это вопрос удобства и не более. Тут надо понять только одну важную вещь: addEventListener() не интересуется, какого класса Событие надо "ловить". Его интересует только строка. Класс же События указывается только в приемнике обработчика, и если придет событие с типом "а", но не того класса, на который настроен обработчик, случится беда. Итак, чтобы ловить ВСЕ события класса AppEvents, нужно подписаться на один тип и ловить их в обработчик, настроенный на AppEvents. Но Вам же нужны РАЗНЫЕ типы событий, чтобы понимать что именно случилось. Эти же константы, которые Вы уже (видимо) завели в своем классе AppEvents, Вы можете использовать для другого свойства. Это свойство нужно ДОБАВИТЬ в класс события AppEvents. Например, добавляем свойство eventType: public class AppEvents extends Event { public var eventType:String; //... список констант // public function AppEvents(type:String, eventType:String, bubbles:Boolean=false, cancelable:Boolean=false) { super(type, bubbles, cancelable); this.eventType= eventType; } public override function clone():Event { return new AppEvents(type, eventType, bubbles, cancelable); } public override function toString():String { return formatToString("AppEvents", "type", "eventType", "bubbles", "cancelable", "eventPhase"); } }
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Oct 2015
Сообщений: 32
|
Да, так я себе это и понял. Еще раз спасибо за ваше терпение =)
Добавлено через 15 минут Не понял еще: Цитата:
В моем понимании Контроллер на то и К., чтобы дергать в нужный момент кого нужно, а остальные классы между собой не общаются на прямую.. это уменьшает количество взаимных связей, а умные книги говорят, что это хорошо =) Последний раз редактировалось 0l3; 23.12.2017 в 23:20. |
Часовой пояс GMT +4, время: 17:58. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|