Просмотр полной версии : Диспатч эвентов не создавая custom
можно но ли как то так ?
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));
}
}
Можно первый вариант. Постоянно использую.
первый вариант не будет работать у евента нету константы Ev.CUSTOM. Может вы имели ввиду чтонибудь другое ?
Тут вроде получается что создавать константы не нужно.
dispatchEvent(new Event("custom"))
Тут вроде получается что создавать константы не нужно.
Код AS3:
dispatchEvent(new Event("custom"))
CUSTOM = 'custom'
dispatchEvent(new Event("custom")) === dispatchEvent(new Event(CUSTOM));
Хватит ерунду писать. не будет такой код работать. Тут дело в чем то другом, да и вообще не факт , что можно, если честно нигде не видел, вот и спросил
первый вариант не будет работать у евента нету константы 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))
}
}
Вас опять пугают импорты?)
Ваш первый вариант не будет работать, потому что константа не статическая, а вы ее через класс дергаете.
Добавлено через 1 минуту
Да и не константа это, но главное, что не статик (или что через класс).
samana !!! разницу видите ? extends EventDispatcher и extends Sprite , как в вашем примере. А она есть :)
Мой первый вариант просто написан криво, реально же у меня static public const иначе бы мне выдало ошибку строка Ev.CUSTOM подумайте сами.
Добавлено через 4 минуты
Ребята, на самом деле, я наверное некорректно создал вопрос. Мне нужно именно на eventDispatcher вешать событие, тоесть на инстанс класса, а не объекта работающего в нем.
Добавлено через 7 минут
Вас опять пугают импорты?)
Вы о чем вообще ?))
Ребята, на самом деле, я наверное некорректно создал вопрос. Мне нужно именно на eventDispatcher вешать событие, тоесть на инстанс класса, а не объекта работающего в нем.
:eek: Первый вопрос был проще в понимании.
1. Спрайт тоже EventDispatcher.
2. ....
3. Ну так вешайте.
3а. Что за таинственный "объект, работающий в нем".
можно.
я вообще имена событий генерил. типа
dispatchEvent(new Event("value of" +data+" is changed");
вру конечно, но это тоже валидно. главное как подписаться.
для подписки на такое событие я бы добалял отдельный метод:
addChangeListener(data:String...){
addEventListener("value of" +data+" is changed",....)
}
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
Хах =)
Супер! Запости в блог (я серьезно).
Читал читал и все равно ниче не понял. Показываю пример, того чего добиваюсь
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
Супер! Запости в блог (я серьезно).
отбой. все не так )
Потому что СНАЧАЛА вызывается конструктор, он диспатчит событие. ЗАТЕМ присоединяется слушатель, который слушает событие, которое ушло в небытие. Нужно сначала подписываться, а затем диспатчить.
КорДум - без разницы, попробуй просто скопировать код и поиграться с ним )) если добьешься диспатча , то тему закроем. Я не добился хоть куда прописывай ты addListener
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, прекратите считать себя самым умным. это не так. в большинстве случаев чушь несёте вы. советую начать прислушиваться к людям. да они тоже иногда ошибаются. но прежде чем кричать "вы не правы", проще проверить. это вам поможет как в плане образования, так и повысит уровень уважения со стороны здешних коллег.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.