Как мне прикрепить слушатель глобального события? - PullRequest
1 голос
/ 18 февраля 2012

Я работаю над приложением AIR:

Главное окно похоже на панель инструментов. С помощью строки меню я могу открыть другие окна с деталями панели. Когда я закрываю их, я хочу обновить главное окно.

Я пытался использовать прослушиватель событий, но результат не очень хороший. Если я открываю подробные окна непосредственно из главного окна, я знаю, как добавить прослушиватель событий - и это работает - но я не знаю, как это сделать, если подробное окно открывается из меню!

Спасибо за помощь.

Ответы [ 3 ]

2 голосов
/ 18 февраля 2012

Синглтон - это то, что вы ищете. Просто поместите диспетчер событий внутрь, и вы сможете слушать из любого места в приложении.

Синглтон подобен наличию уникального экземпляра объекта в памяти, поэтому любой, кто изменяет переменную внутри этого объекта (или отправляет события через него), будет модифицирован для всех.

Вот пример кода о том, как его использовать.

http://life.neophi.com/danielr/2006/10/singleton_pattern_in_as3.html

Примечание: синглтоны являются мощными и опасными одновременно, о том, как их использовать, много говорят, пожалуйста, прочитайте немного больше об этом, если вы планируете построить большой проект. 1012 * Надеюсь, это поможет!

1 голос
/ 18 февраля 2012

Проблема в том, что вы выполняете бизнес-логику из представления. Не делай этого. Вместо этого отправляйте событие из каждого меню, а не открывайте окно прямо из него. Прослушивайте эти события на более высоком уровне, и затем вы можете либо напрямую прослушивать открытые вами новые окна, либо создать класс базового окна, который предоставляет переменную типа IEventDispatcher. Если вы заполняете эту переменную одним и тем же диспетчером событий, то, что вы получаете, называется «шиной событий», и вы можете прослушивать ее для событий.

Эта архитектура требует немного больше обдумывания, чем использование Singleton, но она позволяет избежать тесной связи и других проблем, с которыми вы можете столкнуться, внедрив один в свой проект.

0 голосов
/ 18 февраля 2012

Вы можете прослушивать объект (EventDispatcher) напрямую, добавив к нему прослушиватель событий или, если объект диспетчера находится в списке отображения, например Sprite, вы можете прослушивать на уровне сцены с параметром захвата, установленным в true.

Но главное предостережение в том, что диспетчер должен находиться на сцене, чтобы вы могли поймать это событие.

Ваше главное окно слушает сцену (с capture = true):

stage.addEventListener("MY_CUSTOM_EVENT", handle_custom_event, true);

private function handle_custom_event(e:Event):void
{
  var sub_window:Object = e.target;
  // do something to your sub_window
}

Ваше подокно может отправлять события следующим образом:

dispatchEvent(new Event("MY_CUSTOM_EVENT"));

Но (ab) использование стадии в качестве инфраструктуры передачи сообщений для пользовательских событий таким образом немного запутанно.Вы могли бы рассмотреть более формальную архитектуру передачи сообщений, если вы действительно хотите такого рода коммуникации.Даже статический класс MessageBus, по крайней мере, быстро поможет вам определить, где вы используете это в своей кодовой базе.В любом случае, вы должны быть осторожны с ссылками и утечками памяти.

...