PDA

Просмотр полной версии : [FAME][AS2]разбираемся с EventDispatcher


genius
30.06.2005, 02:42
из туториала (http://www.actionscript.org/tutorials/advanced/using_eventdispatcher/index.shtml) по EventDispatcher на actionscript.org сделал два класса:

import test.Test2
import mx.utils.Delegate;
import mx.events.EventDispatcher;

class test.Test extends Object {
var test2:Test2;

// переменные функции для EventDispatcher
var addEventListener:Function;
var removeEventListener:Function;
var dispatchEvent:Function

function handleConstruct(eventObj) {
TRACE(Flashout.INFO + "handleConstruct called");
}
function Test() {
Flashout.init();
TRACE(Flashout.INFO + "Application started");

EventDispatcher.initialize(this);

var myClass = new test.Test2(1000);
test2.addEventListener('timeout', Delegate.create(this, handleConstruct));

}

// --- Main Entry Point
static function main() {
var test:Test = new Test();
}
}
-------------------------------------------------------------
import mx.events.EventDispatcher;
import mx.utils.Delegate;
class test.Test2 {
var timeInt:Number;

var addEventListener:Function;
var removeEventListener:Function;
var dispatchEvent:Function;

function handleTimer()
{
TRACE(Flashout.INFO + "handleTimer");
dispatchEvent({type:'timeout', target:this, message:'Hey dude the timer is done', time:getTimer()});
clearInterval(timeInt);
}

function Test2(len)
{
EventDispatcher.initialize(this);
timeInt = setInterval(Delegate.create(this, handleTimer), len);
}
}

handleTimer() срабатывает, а вот handleConstruct() уже нет. в чем моя ошибка? помогите советом, пожалуйста :)

genius
02.07.2005, 21:39
я оказался редкостным чайником и вместо test2 написал myClass. работающий код такой:

import test.Test2
import mx.utils.Delegate;
import mx.events.EventDispatcher;

class test.Test extends Object {
var test2:Test2;

// переменные функции для EventDispatcher
var addEventListener:Function;
var removeEventListener:Function;
var dispatchEvent:Function

function handleConstruct(eventObj) {
TRACE(Flashout.INFO + "handleConstruct called");
}
function Test() {
Flashout.init();
TRACE(Flashout.INFO + "Application started");

EventDispatcher.initialize(this);

var test2 = new test.Test2(1000);
test2.addEventListener('timeout', Delegate.create(this, handleConstruct));

}

// --- Main Entry Point
static function main() {
var test:Test = new Test();
}
}
-------------------------------------------------------------
import mx.events.EventDispatcher;
import mx.utils.Delegate;
class test.Test2 {
var timeInt:Number;

var addEventListener:Function;
var removeEventListener:Function;
var dispatchEvent:Function;

function handleTimer()
{
TRACE(Flashout.INFO + "handleTimer");
dispatchEvent({type:'timeout', target:this, message:'Hey dude the timer is done', time:getTimer()});
clearInterval(timeInt);
}

function Test2(len)
{
EventDispatcher.initialize(this);
timeInt = setInterval(Delegate.create(this, handleTimer), len);
}
}

появился ещё вопрос.

в данном примере добавлять "слушателя" нужно следующим методом: test2.addEventListener()

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

KidsKilla
03.07.2005, 01:51
а как ты себе представляешь прослушивание сообщений, не зная кто вещатель? +)

genius
03.07.2005, 06:33
2KidsKilla: ну очень просто, есть же свойство eventObj.type, можно eventObj.dispatcher придумать. одно дело знать, кто вещатель, другое дело - для каждого "слушателя" тыкать прямой ссылкой в "вещателя"

KidsKilla
03.07.2005, 12:28
..........