3

それは生死の問題ではありませんが、これが可能かどうか疑問に思います:

1 つのタイプのカスタム イベント (FormEvent) からいくつかのイベントを取得しました。これらすべてのイベントをリッスンし、イベント タイプに従って処理する FormListener を取得しました。一度に 1 つの eventListener を追加する代わりに、一度にすべてのイベントを追加したいと考えています。

したがって、次のようになります。

        private function addListeners():void {

        addEventListener(FormEvent.SHOW_FORM, formListener);
        addEventListener(FormEvent.SEND_FORM, formListener);
        addEventListener(FormEvent.CANCEL_FORM, formListener);
    }



        private function formListener(event:formEvent):void {

        switch(event.type){
            case "show.form": 
                // handle show form stuff
            break;
            case "send.form":
                // handle send form stuff
            break;
            case "cancel.form":
                // handle cancel form stuff
            break;
        }
    }

しかし、すべてのイベントを一度に1つずつ追加する代わりに、次のようなことをしたいと思います

    private function addListeners():void {

        addEventListener(FormEvent.*, formListener);
    }

このようなことが可能かどうか、私はそれが大好きです。私はたくさんのイベントを扱っています:)

4

2 に答える 2

7

とにかく、この場合、本当に必要なイベントリスナーは 1 つだけです。そのリスナーは、フォームの変更をリッスンし、変更内容に等しいパラメーターがイベント リスナー関数で使用できるようになります。お見せしますが、これは擬似的な状況であり、ディスパッチは暗示されているため、実際にリッスンする必要がないため、通常はメソッド呼び出しのような単純なものからイベントをディスパッチしないことを覚えておいてください。

まずはカスタムイベント


package com.yourDomain.events
{
    import flash.events.Event;
    public class FormEvent extends Event
    {
        //Public Properties
        public static const CANCEL_FORM:int = "0";
        public static const SHOW_FORM:int = "1";
        public static const SEND_FORM:int = "2";

        public static const STATE_CHANGED:String = "stateChanged";

        //Private Properties
        private var formState:int;

        public function FormEvent(formState:int):void
        {
            super(STATE_CHANGED);
            formState = formState;
        }
    }
}

これで、カスタム イベント クラスを作成し、リスナー関数を介して状態をキャッチできるように設定しました。

あなたのコードがどのように見えるか、またはどのように実装されているかはわかりません。重要なのは、イベントをディスパッチするときに、新しい状態を反映するパラメーターを一緒に送信する必要があることに注意することです。


package com.yourDomain.ui
{
   import flash.events.Event;
   import flash.events.EventDispatcher;
   import com.yourDomain.events.FormEvent;
   public class Form extends EventDispatcher
   {
     public function Form():void
     {
        //Anything you want form to do upon instantiation goes here.
     }
     public function cancelForm():void
     {
        dispatchEvent(new Event(FormEvent.CANCEL_FORM);
     }
     public function showForm():void
     {
        dispatchEvent(new Event(FormEvent.SHOW_FORM);
     }
     public function sendForm():void
     {
        dispatchEvent(new Event(FormEvent.SEND_FORM);
     }
   }
}

最後に、それをリッスンするドキュメント クラスを作成します。クラスのメソッドを呼び出したときに起動するリスナーを作成するのは論理的ではないことに注意してください。これは、メソッドを呼び出したことを明らかに知っているためですが、この例ではそれが原因です。


package com.yourDomain.ui
{
   import com.yourDomain.ui.Form;
   import com.yourDomain.events.FormEvent;
   //Form is in the same package so we need not import it.
   public class MainDocumentClass
   {
      private var _theForm:Form;

      public function MainDocumentClass():void
      {
         _theForm  = new Form();
         _theForm.addEventListener(FormEvent.STATE_CHANGED, onFormStateChange, false, 0, true);
         /*
         The following three method calls each cause the
         FormEvent.STATE_CHANGE event to be dispatched.  
         onFormStateChange is notified and checks what 
         the last change actually was.
         */
         _theForm.cancelForm();
         _theForm.showForm();
         _theForm.sendForm();
      }
      private function onFormStateChange(e:FormEvent):void
      {
         switch(e.formState)
         {
            case CANCEL_FORM:
              trace('The form was canceled');
              break;
            case SHOW_FORM:
              trace('The form was revealed');
              break;
            case SEND_FORM:
              trace('The form was sent');
              break;
         }
      }
   }      
}

これが役に立ったことを願っています。遅くなり、後でいくつかのことを修正する必要があるかもしれませんが、これは、独自のイベントを作成し、動作をカスタマイズする方法を理解するのに役立つはずです.

于 2008-09-26T02:32:35.630 に答える
0

それを直接実行できるルーチンは知りませんが、独自のルーチンを作成することはできます。ここでの構文は完全ではありませんが、最初のパスは次のとおりです。

private function addMultipleEventListeners( evts:Array, callback:function ):void
{
    for each( var evt:Event in evts )
    {
        addEventListener( evt, callback );
    }
}

次に、そのルーチンを次のように呼び出すことができます。

var evts:Array = [ FormEvent.SHOW_FORM, FormEvent.SEND_FORM, FormEvent.CANCEL_FORM ];
addMultipleEventListeners( evts, formListener );
于 2008-09-25T21:27:39.577 に答える