PDA

Просмотр полной версии : Обработчик события не видит своего класса


$mival
16.11.2007, 15:46
Есть два класса. в первом (ControlManager) создается экземпляр второго(VideoManager), потом по нажатию кнопки из первого посылается событие во второй(соответственно второй предварительно подписывается на это событие). Во втором есть обработчик события, но он не видит своего класса вообще.
ControlManager:


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

import main.VideoManager;

class main.ControlManager extends MovieClip
{
public var playStatus:Boolean = false; // true - is play
private var play_b:MovieClip;

private var vm:VideoManager;

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

public function ControlManager()
{
play_b = this["pl"];

EventDispatcher.initialize(this);
vm = new VideoManager(this);
}

private function onLoad():Void
{
play_b.onRelease = Delegate.create(this, playHandler);
}

private function playHandler():Void
{
trace("Play/stop нажали");
playStatus ? play_b.gotoAndStop("play") : play_b.gotoAndStop("pause");
playstatus = !playStatus;
}

public function set playstatus(p:Boolean):Void
{
playStatus=p;
dispatchEvent({type:"onPlay",target:this});
}
}

VideoManager:

import mx.events.EventDispatcher;

class main.VideoManager
{
private var obj:Object;

public function VideoManager(o:Object)
{
obj=o;
configureListeners();
}

private function configureListeners():Void
{
obj.addEventListener("onPlay", playHandler);
}

private function playHandler(o:Object):Void {o.target.playStatus ? startVideo() : pauseVideo();}

private function startVideo():Void
{
trace("startVideo");
}
private function pauseVideo():Void
{
trace("pauseVideo");
}
}

т.е. по событию мы должны вызывать поочереди то VideoManager.startVideo(), то VideoManager.pauseVideo(), но они почему то недоступны из самого же VideoManager'a

etc
16.11.2007, 16:47
В сеттере косяк какой-то. Никогда не используй одинаковые имена, но с разным регистром.

$mival
16.11.2007, 16:59
хорошо. поправил
...
private function playHandler():Void
{
trace("Play/stop нажали");
playStatus ? play_b.gotoAndStop("play") : play_b.gotoAndStop("pause");
playStatusSetter = !playStatus;
}

public function set playStatusSetter(p:Boolean):Void
{
playStatus=p;
dispatchEvent({type:"onPlay",target:this});
}
}
вопрос это конечно не решило.

etc
16.11.2007, 17:27
obj.addEventListener("onPlay", Delegate.create(this, this.playHandler));

$mival
16.11.2007, 17:42
заработало.
ох уж эта видимость.
но почему так?

etc
16.11.2007, 17:53
Потому что ты подписываешь метод экземпляра, а не сам экземпляр.