Показать сообщение отдельно
Старый 09.04.2010, 10:13
bw_left вне форума Посмотреть профиль Отправить личное сообщение для bw_left Найти все сообщения от bw_left
  № 6  
Ответить с цитированием
bw_left

Регистрация: Apr 2010
Сообщений: 16
Опыта в AS3 у меня пока немного - решение может оказаться с точки зрения "рентабильности" сомнительное, не знаю по какой причине .... но как бы там ни было - оно работает и выполняет именно то, что нужно. А нужно следующее:

отправлять событие из любой точки (уровня) приложения и ловить его сразу в любой точке (на любом уровне). Допускаю, что наверное есть какой-нибудь специально предназначенный для этого "TopLevelSuperPuperRoot" - но т.к. знаю я не много, и такового пока не встречал. По поводу обхода дерева-событий - тут как-раз нужно чтобы больше никто никуда дальше не ходил ... хотя если понадобиться, я думаю решение будет очевидно.

В общем-то созрело пока следующее решение:

Код AS3:
/* EventsManager.as */
package components
{
	import flash.events.EventDispatcher;
 
	public final class EventsManager{
 
		public static const EDIT_ITEM:String = "editItem";
 
		public static const eventListener:EventDispatcher = new EventDispatcher();
	}
}
 
/* SomeComponent.as */
package components
{
	import spark.components.List;
	import components.*;
 
	public class SomeComponent extends List
	{
		public function SomeComponent()
		{
			super();
 
			EventsManager.eventListener.addEventListener(
				EventsManager.EDIT_ITEM,
				function():void
				{
					trace('closer');
				});
 
		}
	}
}
 
/* ну и где-то в тридевятом царстве, в частности в customItemRenderer-е */
EventsManager.eventListener.dispatchEvent(new ListItemEvent(EventsManager.EDIT_ITEM, data));
Несколько моментов (поправьте пожалуйста если че не то говорю - буду признателен):

1) final прикрутил для красоты
2) public static const eventListener - думаю так правильнее будет

И еще нарисовался интересный баг. Если использовать не closer а нечто вроде
Код AS3:
EventsManager.eventListener.addEventListener(
	EventsManager.EDIT_ITEM,
	_someHandler);
 
 
private function _someHandler(e:ListItemEvent):void
{
	trace('handler');
};
то работает, если класс написан с нуля. Стоит, к примеру, поменять
public static const eventListener
на
public static var eventListener
то все сразу вываливается и _someHandler перестает срабатывать, даже если потом все назад вернуть - очень странное поведение. А через closer работает как часы. Могу предположить (знания мало, поэтому чисто теоретически), что какой-нибудь сборщик мусора собирает чего-нибудь куда-нибудь ибо экземпляра как-такового нет, хотя почему тогда работает первый раз, пока ручками не залезешь что-нить править? Никаких weakReference я не использую. FB и сам Flex самые последние, плеер тоже. (номера версий лень смотреть)

Знающий народ - ответьте плиз - что за баг такой странный?