PDA

Просмотр полной версии : dispatchEvent в чем универсальность?


dvrbear
05.03.2012, 23:23
заранее знаю что будете ругать, но я правда перечитал и пересмотрел кучу примеров - так ничего и не поняв...

вопрос в чем:
везде пишут о том что якобы событие рассылается по ветвям до корня и обратно
и все что лежит на пути может его отловить.
но пробуя ставить в разные места диспатчер и лисентер пришел к выводу, что пути надо прописывать жестко.
например если у нас в коре внутри мувиклипа "cont" лежит слушатель
cont.addEventListener("customEvent", handleEvent);
и на сцену добавляется другой мувик addChild(mc); в котором по нажатию мышки происходит диспатчь
MovieClip(parent)["cont"].dispatchEvent(new Event("customEvent"));

то работает только таким макаром

четко прописан слушатель
и четко к нему указывается диспатчер

и никакой универсальности нет :(((
простой dispatchEvent(new Event("customEvent"));
не рассылает ни на сцену, ни в cont событие пока ему не прописать путь

очень расчитываю на простой и четкий ответ
чего мой мозг не моежт понять?
попрошу без тыканья в хелп и прочие примитивные ОДНЕОУРОВНЕВЫЕ примеры

СПАСИБО!

Zebestov
05.03.2012, 23:28
потому что
dispatchEvent(new Event("customEvent", true));

Добавлено через 2 минуты
попрошу без тыканья в хелп
А вот без этого никак: тык (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/events/Event.html#Event())!

dvrbear
06.03.2012, 00:03
огромное спасибо!

поставил прост слушатель в корень
addEventListener("customEvent", handleEvent);
в добавляемом мувике добавил true
dispatchEvent(new Event("customEvent", true));

и корень отловил событие )))

если можно последний вопрос...

если поменять местами слушатель с диспатчером,
то слушатель отловит диспатчь-корня у себя внутри своим лисантером?
(опятьже без указания путей)

XoJlToH
06.03.2012, 00:22
нет конечно. событие всплывает вверх по цепочке диспетчиризации
для таких целей я использую диспатчер, завернутый в синглтон, хотя это и не есть слишком хорошо

dvrbear
06.03.2012, 00:41
завернутый в синглтон

можно пример?

XoJlToH
06.03.2012, 01:00
Singleton
package com
{
import flash.events.EventDispatcher;

public class Singleton
{

private static var instance:Singleton = new Singleton();
public var _dispatcher:EventDispatcher = new EventDispatcher();

public function Singleton()
{
if (instance)
{
throw new Error("We cannot create a new instance. Please use Singleton.getInstance()");
}
}

public static function getInstance():Singleton
{
return instance;
}
}
}

Main
package
{
import com.Singleton;
import com.TestChild;
import flash.events.Event;

public class Main extends Sprite
{

private var test:TestChild;
private var _global:Singleton = Singleton.getInstance();
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);
test = new TestChild();
_global._dispatcher.dispatchEvent(new Event(Event.ID3))

}


}

}

Test child
package
{
import com.Singleton;
import flash.display.MovieClip;
import flash.events.Event;

public class TestChild extends MovieClip
{

private var _global:Singleton = Singleton.getInstance();
public function TestChild():void
{
_global._dispatcher.addEventListener(Event.ID3,onEvent)
}
private function onEvent(e:Event):void {
trace (e)
}

}

}

Идея примерно такая. Писал в блокноте, так что сходу может не работать :)

dimarik
06.03.2012, 23:54
Эээ. Это вы делаете, чтобы жизнь малиной не казалась? Я про _global. И заворачиваете в синглетон, потому что поняли как он работает?