2009-04-02 6 views
8

私はAS3イベントモデルが大好きです。私のコードをきれいにして、壊れにくくするのに役立ちます。私がAS2プロジェクトで作業していたとき、私のコードはあまり素敵ではなく、クラスはお互いに依存していました。スコープのAS2の奇妙な処理のために、私はAS2イベントシステムで実際に乗り遅れたことはありません。ActionScript 2イベントのベストプラクティス - ActionScript 3スタイルのイベントをシミュレートする方法はありますか?

私はまだ時折AS2で仕事をしなければならないとして、私の質問は次のとおりです。

は誰がAS2でAS3イベントAPIをシミュレートするために管理し、もししていない、に耳を傾け、イベントをディスパッチするためのベストプラクティス何で、処理範囲?

答えて

9

実際にこれを行うのはかなり簡単です。クラスのカップルはあなたを得る必要があります。

class com.rokkan.events.Event 
{ 

    public static var ACTIVATE:String = "activate"; 
    public static var ADDED:String = "added"; 
    public static var CANCEL:String = "cancel"; 
    public static var CHANGE:String = "change"; 
    public static var CLOSE:String = "close"; 
    public static var COMPLETE:String = "complete"; 
    public static var INIT:String = "init"; 

    // And any other string constants you'd like to use... 

    public var target; 
    public var type:String; 

    function Event($target, $type:String) 
    { 
     target = $target; 
     type = $type; 
    } 

    public function toString():String 
    { 
     return "[Event target=" + target + " type=" + type + "]"; 
    } 
} 

を次に、Iは、2つの他のベースクラスを使用する:次のように最初は、Eventクラスです。 1つは通常のオブジェクト用で、拡張する必要があるオブジェクトの場合はMovieClipです。まず非MovieClipバージョン...

import com.rokkan.events.Event; 
import mx.events.EventDispatcher; 

class com.rokkan.events.Dispatcher 
{ 

    function Dispatcher() 
    { 
     EventDispatcher.initialize(this); 
    } 

    private function dispatchEvent($event:Event):Void { } 
    public function addEventListener($eventType:String, $handler:Function):Void { } 
    public function removeEventListener($eventType:String, $handler:Function):Void { } 
} 

MovieClipバージョン...

import com.rokkan.events.Event; 
import mx.events.EventDispatcher; 

class com.rokkan.events.DispatcherMC extends MovieClip 
{ 

    function DispatcherMC() 
    { 
     EventDispatcher.initialize(this); 
    } 

    private function dispatchEvent($event:Event):Void { } 
    public function addEventListener($eventType:String, $handler:Function):Void { } 
    public function removeEventListener($eventType:String, $handler:Function):Void { } 
} 

は単にディスパッチャまたはDispatcherMCのいずれかを使用してオブジェクトを拡張し、あなたがイベントを送出し、イベントをリッスンすることができるようになりますAS3と同様です。ほんのいくつかの癖があります。たとえば、dispatchEvent()を呼び出す場合は、イベントをディスパッチするオブジェクトへの参照を渡す必要があります。通常は、オブジェクトのthisプロパティを参照するだけです。

import com.rokkan.events.Dispatcher; 
import com.rokkan.events.Event; 

class ExampleDispatcher extends Dispatcher 
{ 
    function ExampleDispatcher() 
    { 

    } 

    // Call this function somewhere other than within the constructor. 
    private function notifyInit():void 
    { 
      dispatchEvent(new Event(this, Event.INIT)); 
    } 
} 

もう1つは、そのイベントを聴きたいときです。 AS2では、イベント処理関数の正しい範囲を取得するためにDelegate.create()を使用する必要があります。例:

import com.rokkan.events.Event; 
import mx.utils.Delegate; 

class ExampleListener 
{ 
    private var dispatcher:ExampleDispatcher; 

    function ExampleDispatcher() 
    { 
     dispatcher = new ExampleDispatcher(); 
     dispatcher.addEventListener(Event.INIT, Delegate.create(this, onInit); 
    } 

    private function onInit(event:Event):void 
    { 
     // Do stuff! 
    } 
} 

このファイルをすべて私の古いファイルから正しくコピーして貼り付けてください。これがあなたのために働くことを願っています。

+0

ありがとう! – Iain

+0

@Matt W、なぜ$記号がありますか? – Simsons

+0

@Subhenは、ローカル変数とインスタンス変数から関数のパラメータを表すために使用していた、古いコードスタイルの規約だけです。 –

関連する問題