Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Диспатч эвентов не создавая custom (http://www.flasher.ru/forum/showthread.php?t=150857)

in4core 19.02.2011 01:12

Диспатч эвентов не создавая custom
 
можно но ли как то так ?

Код AS3:

public class Ev extends EventDispatcher {
 
  public var CUSTOM:String = 'cust';
  public function Ev() {
 
  this.dispatchEvent(new Event(Ev.CUSTOM));
  }
}

Или без такой конструкции не обойтись никак ?

Код AS3:

import EvEvents;
 
public class Ev extends EventDispatcher {
 
 
  public function Ev() {
 
  this.dispatchEvent(new EvEvents(EvEvents.CUSTOM));
  }
}


GBee 19.02.2011 01:30

Можно первый вариант. Постоянно использую.

in4core 19.02.2011 01:32

первый вариант не будет работать у евента нету константы Ev.CUSTOM. Может вы имели ввиду чтонибудь другое ?

samana 19.02.2011 01:36

Тут вроде получается что создавать константы не нужно.
Код AS3:

dispatchEvent(new Event("custom"))


in4core 19.02.2011 01:43

Цитата:

Тут вроде получается что создавать константы не нужно.
Код AS3:

dispatchEvent(new Event("custom"))

Код AS3:

CUSTOM = 'custom'
 
dispatchEvent(new Event("custom"))  ===  dispatchEvent(new Event(CUSTOM));

Хватит ерунду писать. не будет такой код работать. Тут дело в чем то другом, да и вообще не факт , что можно, если честно нигде не видел, вот и спросил

samana 19.02.2011 01:50

Цитата:

Сообщение от in4core (Сообщение 974463)
первый вариант не будет работать у евента нету константы Ev.CUSTOM. Может вы имели ввиду чтонибудь другое ?

Всё работает, к чему возмущаться?
Код AS3:

public class Main extends Sprite 
        {
                static public const CUSTOM:String = "custom";
 
                public function Main():void
                {
                        addEventListener(Main.CUSTOM, cc);
                        dispatchEvent(new Event(Main.CUSTOM))
 
                }
        }


Bgg 19.02.2011 01:54

Вас опять пугают импорты?)

GBee 19.02.2011 02:00

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

Добавлено через 1 минуту
Да и не константа это, но главное, что не статик (или что через класс).

in4core 19.02.2011 03:23

samana !!! разницу видите ? extends EventDispatcher и extends Sprite , как в вашем примере. А она есть :)

Мой первый вариант просто написан криво, реально же у меня static public const иначе бы мне выдало ошибку строка Ev.CUSTOM подумайте сами.

Добавлено через 4 минуты
Ребята, на самом деле, я наверное некорректно создал вопрос. Мне нужно именно на eventDispatcher вешать событие, тоесть на инстанс класса, а не объекта работающего в нем.

Добавлено через 7 минут
Цитата:

Вас опять пугают импорты?)
Вы о чем вообще ?))

GBee 19.02.2011 03:45

Цитата:

Ребята, на самом деле, я наверное некорректно создал вопрос. Мне нужно именно на eventDispatcher вешать событие, тоесть на инстанс класса, а не объекта работающего в нем.
:eek: Первый вопрос был проще в понимании.

Wolsh 19.02.2011 03:51

1. Спрайт тоже EventDispatcher.
2. ....
3. Ну так вешайте.
3а. Что за таинственный "объект, работающий в нем".

Котяра 19.02.2011 03:55

можно.
я вообще имена событий генерил. типа
Код AS3:

dispatchEvent(new Event("value of" +data+" is changed");

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

addChangeListener(data:String...){
addEventListener("value of" +data+" is changed",....)
}


КорДум 19.02.2011 10:00

Цитата:

samana !!! разницу видите ? extends EventDispatcher и extends Sprite , как в вашем примере. А она есть :)
Все samana верно говорит.
in4core, вы видели иерархию наследования?
Цитата:

Sprite - DisplayObjectContainer - InteractiveObject - DisplayObject - EventDispatcher - Object
Код AS3:

private var /*const*/ CUSTOM:String = "custom";
...
dispatchEvent(new Event(CUSTOM));
// или так, хотя красивее через константу
dispatchEvent(new Event("custom"));
...
addEventListener(CUSTOM /*"custom"*/, myFoo)


Psycho Tiger 19.02.2011 10:29

Цитата:

Мне нужно именно на eventDispatcher вешать событие, тоесть на инстанс класса, а не объекта работающего в нем.
Дам доллар если Вы повесите слушатель события не на IEventDispatcher.

mikhailk 19.02.2011 10:59

Я, честно говоря, необходимости в расширении классов Even и EventDispatcher как-то не вижу вообще. Вернее, на полном серьезе увлекался этим, пока тут на форуме кто-то не спросил "а зачем?". :D

Фактически, диспатчится строка, обернутая в Event, ее можно формировать как угодно, главное потом знать, как подписать слушателя.

Код AS3:

package 
{
    import flash.display.Sprite;
    import flash.events.Event;
 
    public class Main extends Sprite
    {
 
 
        public function Main():void
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
 
        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
 
            var eventName:String;
 
            eventName = "eventNumber1";
            addEventListener(eventName, onEventIncomig);
            dispatchEvent(new Event(eventName));
 
            eventName = "eventNumber2";
            addEventListener(eventName, onEventIncomig);
            dispatchEvent(new Event(eventName));
        }
 
        private function onEventIncomig(e:Event) : void
        {
            trace("onEventIncomig",e);
 
        }
 
    }
 
}

трейс:

Код:

onEventIncomig [Event type="eventNumber1" bubbles=false cancelable=false eventPhase=2]
onEventIncomig [Event type="eventNumber2" bubbles=false cancelable=false eventPhase=2]

Добавлено через 7 минут
ЗЫ. Хотя мне лично все-таки больше нравится канонический стиль
addEventListener(ClassName.CONSTANT_NAME,...), а дальше уже получение информации через e.target

Вся эта передача информации внутри имени события - от лукавого

cleptoman 19.02.2011 11:13

инфокор открыл книжку на странице Ивентов? )

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

gloomyBrain 19.02.2011 11:20

Цитата:

Дам доллар если Вы повесите слушатель события не на IEventDispatcher
Код AS3:

public class NotEventDispatcher { // extends Object
 
private const _dispatcher:EventDispatcher = new EventDispatcher(this);
 
...
 
 
public function addEventListener(....) {
_dispatcher.addEventListener(...)
}
}

Высылай авиапочтой =)

cleptoman 19.02.2011 11:33

и как, Event.target покажет на твой Object ?)

gloomyBrain 19.02.2011 11:36

да, именно на него и покажет

cleptoman 19.02.2011 11:43

ну, вроде new EventDispatcher(this);
уже даст ошибку с конвертацией Object в IEventDispatcher

gloomyBrain 19.02.2011 11:52

А, блин, точно =) Сейчас что-нибудь придумаю, мне очень нужен доллар =)

Psycho Tiger 19.02.2011 11:52

Аха, правда за cleptoman`ом. Ты повесил на приватное поле слушатель, а не на NotEventDispatcher :P

Разве что собственная реализация EventDispatcher, но это не катит )

cleptoman 19.02.2011 12:01

ха, Тигра, про закрытие метода dispatchEvent у LoaderInfo чо нарыл:

Код AS3:

private function init(e:Event = null):void         {
removeEventListener(Event.ADDED_TO_STAGE, init);
var ed:EventDispatcher = new EventDispatcher(this.loaderInfo);
this.loaderInfo.addEventListener(Event.COMPLETE, _onComplete);
//this.loaderInfo.dispatchEvent(new Event(Event.COMPLETE)); //  выдаст ошибку "Error #2118: Класс LoaderInfo не реализует этот метод."
ed.dispatchEvent(new Event(Event.COMPLETE)); // а так вполне себе реализует )))
}
 
private function _onComplete(e:Event):void {
trace(e.target); // [object LoaderInfo] гыгы)
}


Psycho Tiger 19.02.2011 12:09

Хах =)
Супер! Запости в блог (я серьезно).

in4core 19.02.2011 13:23

Читал читал и все равно ниче не понял. Показываю пример, того чего добиваюсь

Код AS3:

public class Ev extends EventDispatcher {
 
public static const CUSTOM = "custom";
 
public function Ev() {
}
public function show() {
 
this.dispatchEvent(new Event(CUSTOM));
 
}
}

Поехали в майн

Код AS3:

var ev:Ev = new Ev();
 
ev.addEventListener(Ev.CUSTOM , foo);
 
ev.show();
 
function foo(e:Event) {
  trace('ok');
}

Тоесть в моем примере слушателем является сам инстанс унаследованный от EventDispatcher. Вот именно такой код не работает. Можно ли его привести в действие ?

cleptoman 19.02.2011 13:25

Цитата:

Супер! Запости в блог (я серьезно).
отбой. все не так )

КорДум 19.02.2011 13:27

Потому что СНАЧАЛА вызывается конструктор, он диспатчит событие. ЗАТЕМ присоединяется слушатель, который слушает событие, которое ушло в небытие. Нужно сначала подписываться, а затем диспатчить.

in4core 19.02.2011 13:31

КорДум - без разницы, попробуй просто скопировать код и поиграться с ним )) если добьешься диспатча , то тему закроем. Я не добился хоть куда прописывай ты addListener

КорДум 19.02.2011 13:37

Код AS3:

package  {
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Main extends Sprite {
 
                public function Main():void {
                        var temp:Temp = new Temp();
                        temp.addEventListener("aaa", foo);
                        temp.dispatch();
                }
 
                private function foo(e:Event):void {
                        trace(e);
                        // [Event type="aaa" bubbles=false cancelable=false eventPhase=2]
                }
        }
}
 
package  {
        import flash.events.Event;
        import flash.events.EventDispatcher;
 
        public class Temp extends EventDispatcher {
 
                public function Temp() {
                        addEventListener("aaa", foo);
                        dispatchEvent(new Event("aaa"));
                }
 
                public function dispatch():void {
                        dispatchEvent(new Event("aaa"));
                }
 
                private function foo(e:Event):void {
                        trace(e);
                        // [Event type="aaa" bubbles=false cancelable=false eventPhase=2]
                }
        }
}

Вуаля!

Psycho Tiger 19.02.2011 13:43

А кому-это Вы в конструкторе событие посылаете? )

cleptoman 19.02.2011 13:44

тож не понял проблеммы.
попытался скомпилить в FD - заругался на неопределенные типы.
прописал константе тип стринг и возвращаемый тип void методу show.
все скомпилилось и отработало.

RandomUser 19.02.2011 13:47

in4core, а у меня ваш код работает....

mikhailk 19.02.2011 15:59

Цитата:

попытался скомпилить в FD - заругался на неопределенные типы.
прописал константе тип стринг и возвращаемый тип void методу show.
все скомпилилось и отработало.
+1
а она и не может не работать
это в общем-то схема типовая, только к кастомизации диспатча эвентов она никакого отношения не имеет :)

Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        var pers:Pers = new Pers();
                        pers.addEventListener(Pers.PERS_READY, onPersReady);
                        pers.init();
                }
 
                private function onPersReady(e:Event) :void
                {
                        trace("Pers is ready");
                }
 
        }
}
 
package 
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Pers extends Sprite
        {
 
                public static const PERS_READY:String = "persReady";
 
                public function Pers()
                {
                        // здесь создаем болванку перса
                }
 
                public function init() : void
                {
                        // здесь инициализируем перса
 
                        // сообщаем наверх, что перс готов
                        dispatchEvent(new Event(PERS_READY));
                }
        }
 
}


BlooDHounD 19.02.2011 20:41

in4core, прекратите считать себя самым умным. это не так. в большинстве случаев чушь несёте вы. советую начать прислушиваться к людям. да они тоже иногда ошибаются. но прежде чем кричать "вы не правы", проще проверить. это вам поможет как в плане образования, так и повысит уровень уважения со стороны здешних коллег.


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

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