2

カスタム イベントを作成する場合、どのようなフォームが適切か疑問に思っていました。CustomEvent クラスを作成し、関数内に一時ディスパッチャを作成して、CustomEvent をディスパッチする必要があります。または、CustomEventDispatcher クラスを作成して、CustomEvent クラスをそのクラスの内部クラスとして作成する方がよいでしょうか。たとえば、次のようになります。

package
{

   public class CustomEventDispatcher extends EventDispatcher
   {
     public function CustomEventDispatcher()
     {
       super(new CustomEvent());
     }

   }
}

class CustomEvent
{
   public function CustomEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
   {
      super(type, bubbles, cancelable)
   }                                               
}
4

3 に答える 3

2

一方的に、イベントを一般公開する方がよいでしょう。このようにして、リスナーを入力し (コードのヒントとデバッグに適しています)、Event に public static const 型を持たせることができます (これも調べることができます)。

于 2011-06-23T04:21:05.590 に答える
0

clone をオーバーライドすることを忘れないでください。デバッグのために toString をオーバーライドすることもお勧めします。

これが私のカスタム イベントの 1 つの例です。

package com.mattie.events
{
//Imports
import flash.events.Event;

//Class
public class SearchFieldEvent extends Event
    {
    //Constants
    public static const SEARCH_COMPLETE:String = "search complete";

    //Variables
    public var totalResults:uint;
    public var duration:uint;
    public var searchText:String;

    //Constructor
    public function SearchFieldEvent(type:String, totalResults:uint = 0, duration:uint = 0, searchText:String = "") 
        {
        super(type);

        this.totalResults = totalResults;
        this.duration = duration;
        this.searchText = searchText;
        }

    //Override clone
    public override function clone():Event
        {
        return new SearchFieldEvent(type, totalResults, duration, searchText);
        }

    //Override toString
    public override function toString():String
        {
        return formatToString("SearchFieldEvent", "type", "totalResults", "duration", "searchText");
        }
    }
}
于 2011-06-23T05:46:49.810 に答える
0

イベントの仕組みを考えるとき、答えるべき基本的な質問が 2 つあります。

1) イベントのディスパッチャ インスタンスを作成するにはどうすればよいですか?

一般的なオプションは次のとおりです。EventDispatcher を拡張するか、ディスパッチャー インスタンスを集約します。

最も基本的で一般的な方法 (および公式ドキュメントにも記載されています) は、EventDispatcher クラスを拡張して、クラスにイベント ディスパッチ機能を提供することです。

長所: 簡単に実装できます。 extends EventDispatcher と入力するだけで完了です。

短所:他のものを拡張することはできません。どうやら、これが多くのネイティブ クラスが EventDispatcher の孫である理由です。手間を省くためだと思います。

2 番目の一般的なアプローチは、ディスパッチャ インスタンスを集約することです。

package
{
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.events.IEventDispatcher;

    public class ClassA implements IEventDispatcher
    {
        private var dispatcher:EventDispatcher;

        public function ClassA()
        {
            initialize();
        }

        private function initialize():void
        {
            dispatcher = new EventDispatcher(this);
        }

        public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
        {
            dispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);
        }

        public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
        {
            dispatcher.removeEventListener(type, listener, useCapture);
        }

        public function dispatchEvent(event:Event):Boolean
        {
            return dispatcher.dispatchEvent(event);
        }

        public function hasEventListener(type:String):Boolean
        {
            return dispatcher.hasEventListener(type);
        }

        public function willTrigger(type:String):Boolean
        {
            return dispatcher.willTrigger(type);
        }
    }
}

注: 集計クラスへの参照をディスパッチャー コンストラクターに渡します。これは、ディスパッチャ インスタンス自体ではなく、event.target がクラス インスタンスを参照するようにするために行われます。

長所:好きなように自由に拡張できます。ディスパッチャー フックを使用して、リスナー リストの維持などのトリックを行うことができます。

短所:最初のアプローチほど単純ではありません。

2) イベントでカスタム データを渡すにはどうすればよいですか?

一般的なオプションは次のとおりです。イベント インスタンスでデータを渡すか、イベント ハンドラで event.target 参照のみを使用してソースから一部のデータにアクセスします。

event.target を介して必要なすべてのデータにアクセスすることを選択した場合 -- 追加の作業は必要ありません。イベント ハンドラーでこの参照を適切なクラスにキャストするだけです。

イベントと一緒にデータを渡したい場合は、イベントをサブクラス化し、上記の回答が示すように、このクラスはイベントを処理するコードにパブリックに表示される必要があります。AS3 は厳格で強力な型付けがすべてです。

Event サブクラスで clone() メソッドをオーバーライドする必要があるのは、処理されたイベントを再ディスパッチする場合のみです。公式ドキュメントによると、念のため、カスタム イベント クラスを作成するたびに、これを行う必要があります。

于 2011-06-23T14:37:20.553 に答える