PDA

Просмотр полной версии : Диспатч эвентов не создавая custom


in4core
19.02.2011, 01:12
можно но ли как то так ?

public class Ev extends EventDispatcher {

public var CUSTOM:String = 'cust';
public function Ev() {

this.dispatchEvent(new Event(Ev.CUSTOM));
}
}

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


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
Тут вроде получается что создавать константы не нужно.
dispatchEvent(new Event("custom"))

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

dispatchEvent(new Event("custom"))


CUSTOM = 'custom'

dispatchEvent(new Event("custom")) === dispatchEvent(new Event(CUSTOM));
Хватит ерунду писать. не будет такой код работать. Тут дело в чем то другом, да и вообще не факт , что можно, если честно нигде не видел, вот и спросил

samana
19.02.2011, 01:50
первый вариант не будет работать у евента нету константы Ev.CUSTOM. Может вы имели ввиду чтонибудь другое ?
Всё работает, к чему возмущаться?
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
можно.
я вообще имена событий генерил. типа
dispatchEvent(new Event("value of" +data+" is changed");
вру конечно, но это тоже валидно. главное как подписаться.
для подписки на такое событие я бы добалял отдельный метод:
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
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, ее можно формировать как угодно, главное потом знать, как подписать слушателя.


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


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 чо нарыл:

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
Читал читал и все равно ниче не понял. Показываю пример, того чего добиваюсь

public class Ev extends EventDispatcher {

public static const CUSTOM = "custom";

public function Ev() {
}
public function show() {

this.dispatchEvent(new Event(CUSTOM));

}
}

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

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
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
а она и не может не работать
это в общем-то схема типовая, только к кастомизации диспатча эвентов она никакого отношения не имеет :)


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, прекратите считать себя самым умным. это не так. в большинстве случаев чушь несёте вы. советую начать прислушиваться к людям. да они тоже иногда ошибаются. но прежде чем кричать "вы не правы", проще проверить. это вам поможет как в плане образования, так и повысит уровень уважения со стороны здешних коллег.