문제
AS2.0에서 dispatchEvent를 어떻게 구현할까요?
사용법
액션스크립트 2.0에 와서 제대로된 클래스 키워드가 도입되면서 OOP 구현이 가능하게 되었습니다.
3.0에서 사용하는 dispatcherEvent 기능을 사용하여 이벤트리스너를 등록해서 값을 받아오는 클래스를 구현해 보도록 하겠습니다..
/******************************************
* TT.as : 리스너 클래스
* EventSource.as : 이벤트를 발생하는 클래스
* TT_test : 소스 fla 파일
******************************************/
//EventSource.as 클래스 -------------------------------------------
import mx.events.EventDispatcher; //이벤트관리 클래스
import mx.utils.Delegate; //스코프해결 클래스
class EventSource
{
private var _dispatcher: EventDispatcher;
private var _container: MovieClip;
public function EventSource( $target: MovieClip )
{
this._container = $target;
this.setEvent();
}
private function setEvent(): Void
{
this._dispatcher = new EventDispatcher();
this._container.onLoad = Delegate.create( this, dispatcher );
// this._container.onRollOver= Delegate.create( this, dispatcher );
// this._container.onRollOut= Delegate.create( this, dispatcher );
// this._container.onRelease= Delegate.create( this, dispatcher );
}
private function dispatcher(): Void
{
var info: Object = {};
info.data = "데이타";
this._dispatcher.dispatchEvent( { type: "onLoadComplete", target: info } );
// this._dispatcher.dispatchEvent( { type: "rollOver", target: info } );
// this._dispatcher.dispatchEvent( { type: "rollOut", target: info } );
// this._dispatcher.dispatchEvent( { type: "click", target: info } );
}
//register event
public function addEventListener( event: String, listener: Object ): Void
{
this._dispatcher.addEventListener( event, listener );
}
public function removeEventListener( event: String, listener: Object ): Void
{
this._dispatcher.removeEventListener( event, listener );
}
}
//TT.as 클래스 -------------------------------------------
import mx.events.EventDispatcher;
import mx.utils.Delegate;
import EventSource;
class TT
{
private var _obj: EventSource;
public function TT( $target: MovieClip )
{
this._obj = new EventSource( $target );
//Delegate.create(scopeObject, function) 레퍼런스 참조;
this._obj.addEventListener( "onLoadComplete", Delegate.create( this, onLoadHandler));
// this._obj.addEventListener( "rollOver", Delegate.create( this, rollOverHandler));
// this._obj.addEventListener( "rollOut", Delegate.create( this, rollOutLoadHandler));
// this._obj.addEventListener( "click", Delegate.create( this, clickHandler));
}
private function onLoadHandler( e: Object ): Void
{
trace( "\""+e.target.data+"\" 출력" );
}
// private function rollOverHandler( e: Object ): Void {};
// private function rollOutLoadHandler( e: Object ): Void {};
// private function clickHandler( e: Object ): Void {};
}
//TT_test.fla 파일 -------------------------------------------
import TT;
var _tt: TT = new TT( this );
전체 구성을 보면 3.0과 비슷한 체계를 가지고 있음을 알 수 있습니다. 3.0과 몇가지 차이점을 비교해보면
첫번째는 package 키워드가 없음.
두번째는 스코프문제를 Delegate 클래스를 사용해서 해결, 3.0에는 스코프문제가 없음.
세번째는 dispatchEvent 인자로 Event 클래스가 아닌 Object 를 사용하고 기본인자로 type 속성을 가짐.
아직까지 2.0버전이 많이 쓰여지고 있는 점을 가만하면 2.0도 클래스를 활용해 OOP형태로 구현해보는것도 좋은 방법이 될 수 있겠네요.
'액션스크립트 2.0' 카테고리의 다른 글
AS2.0에 대한 생각... (0) | 2010.10.25 |
---|