Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Слушатель события для статического класса (http://www.flasher.ru/forum/showthread.php?t=163469)

Max360 09.08.2011 00:41

Слушатель события для статического класса
 
Здравствуйте. Создал статический класс А (т.е. класс со всеми статическими методами и свойствами). Отсюда пользуюсь тем, что могу не создавать его экземпляр. Появилась необходимость пользовательского события, т.е. мой класс А, выплевывает событие, а слушатель на него я почему-то повесить не могу! Это действительно так, на статический класс нельзя повесить слушатель?

Bgg 09.08.2011 00:45

Слушатель можно повесить на экземпляр класса, а не на класс. Ищите на форуме, буквально на прошлой неделе тоже самое спрашивали.

Котяра 09.08.2011 00:52

создайте
Код AS3:

StaticClass
static const dispatcher:EventDispatcher = new EventDispatcher();

доступ
Код AS3:

StaticClass.dispatcher.addEventListener/dispatchEvent

итп
Цитата:

мой класс А, выплевывает событие
а как вы этого добились?

nOobCrafter 09.08.2011 00:54

Код AS3:

        public class UserData extends EventDispatcher
        {
//- PRIVATE & PROTECTED VARIABLES -------------------------------------------------------------------------
                private static var _instance                        :UserData;                                                // он диспатчит события об обновлении
....
 
//- CONSTRUCTOR        -------------------------------------------------------------------------------------------
                public function UserData()
                {
                        _instance                = this;
                }
 
//- PUBLIC & INTERNAL METHODS -----------------------------------------------------------------------------
                public static function addEventListener($eventType:String, $handler:Function, $useCapture:Boolean = false, $priority:int = 0, $useWeakReference:Boolean = true):void
                {
                        _instance.addEventListener($eventType, $handler, $useCapture, $priority, $useWeakReference);
                }
 
                public static function removeEventListener($eventType:String, $handler:Function, $useCapture:Boolean = false) : void
                {
                        _instance.removeEventListener($eventType, $handler, $useCapture);
                }
 
                public function updateArmy($data:Array):void 
                {
....
                                if (UserData._instance)
                                        UserData._instance.dispatchEvent(new Event(UserData.UPDATE_ARMY));
                                return;
                }

что то типа такого, только 1 раз надо будет вызвать конструктор.

Котяра 09.08.2011 01:35

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

Wolsh 09.08.2011 12:12

Можно и "класс подписать"))
Код AS3:

package  
{
        import flash.events.Event;
        import flash.events.EventDispatcher;
 
        public class Screamer
        {
                public static const SCREAM:String = "scream";
 
                private static const DISPATCHER:EventDispatcher = new EventDispatcher();
 
                public static function addEventListener(eventType:String, callback:Function):void
                {
                        DISPATCHER.addEventListener(eventType, callback);
                }
 
                public static function dispatchEvent(event:Event):void
                {
                        DISPATCHER.dispatchEvent(event);
                }
        }
 
}

Последний метод (Screamer.dispatchEvent) можно сделать приватным, чтобы посылать события только по воле класса, а не извне. А в таком виде usage будет -
Код AS3:

Screamer.addEventListener(Screamer.SCREAM, onScream);
Screamer.dispatchEvent(new Event(Screamer.SCREAM));
private function onScream(event:Event):void
{
        trace("Scream");
}


Котяра 09.08.2011 12:49

Таким образом, например, сделан
Код AS3:

 EventBus.dispatchEvent

в SpringFramework.
По сути глобальный бродкастер. В некоторых случаях удобно.

nOobCrafter 09.08.2011 12:58

Wolsh а чем это отличается от того что я предложил 2мя постами выше?
Котяра имхо такой синтаксис как у меня и Wolsh удобнее, нежели писать еще одну строчку, опять же как написано выше, я ограничиваю возможность диспатчить ивент только телом этого класса.
В чем смысл того что я сделал:
1. Есть некий ApplicationData в нем находятся настройки \ опции для всего приложения, есть некий UserData это некие данные о пользователе, его имя, уровень, войска и т.д., которые могут обновляться и соответственно нам надо это отображать.
2. В ApplicationData:
Код AS1/AS2:

        public class ApplicationData
        {
//- PRIVATE & PROTECTED VARIABLES -------------------------------------------------------------------------
                private static var _user:UserData = new UserData();
 
//- PUBLIC & INTERNAL METHODS -----------------------------------------------------------------------------               
                public static function updateUserData($data:Object):void 
                {
                        _user.update($data);
                }

В моем случае у меня только один метод для обновления инфы, а дальше в нем уже идет парсинг обьекта и диспатчинг событий. Таким образом только 1 класс может обновлять данные пользователя и мы имеем удобный синтаксис вида:
Код AS3:

                        UserData.addEventListener(UserData.UPDATE_RESOURCES, onUserUpdateInfoHandler);
                        UserData.addEventListener(UserData.UPDATE_LEVEL, onUserUpdateInfoHandler);
                        UserData.addEventListener(UserData.UPDATE_TECHNOLOGIES, onUserUpdateInfoHandler);
                        UserData.addEventListener(UserData.UPDATE_BUILDINGS, onUserUpdateInfoHandler);
 
 
                private function onUserUpdateInfoHandler(e:Event):void
                {
                        trace("USER UPDATE HANDLER", e.type);
                        UserData.money
                        UserData.level
                        UserData.buildings
                        ....
                }

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

dimarik 09.08.2011 13:07

ApplicationData сильно смахивает на контроллер

Котяра 09.08.2011 13:07

nOobCrafter вопрос был в другом.
я кстати хотел дописать в своём посте что можете по желанию дописать свои статические методы dispatchEvent/addEventListener, которые будут декораторами для константы dispatcher.
Но я подумал, что до этого додумаются сами.

А твой код ужасен и совсем не в тему. )


Часовой пояс GMT +4, время: 07:30.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.