فلاش:الاستماع إلى جميع الأحداث من نوع واحد eventlistener

StackOverflow https://stackoverflow.com/questions/135938

  •  02-07-2019
  •  | 
  •  

سؤال

انها ليست مسألة حياة أو موت ولكن أنا أتساءل عما إذا كان هذا يمكن أن يكون من الممكن:

لقد حصلت على زوجين من المناسبات من نوع واحد من الأحداث المخصصة (FormEvent) الآن لدي FormListener أن يستمع إلى كل تلك الأحداث و مقابض لهم حسب نوع الحدث.بدلا من إضافة أحد 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;
        }
    }

ولكن بدلا من إضافة كل حدث واحد في ذلك الوقت كنت تفضل أن تفعل شيئا مثل

    private function addListeners():void {

        addEventListener(FormEvent.*, formListener);
    }

أنا أتساءل عما إذا كان هناك شيء مثل هذا ممكن, أنا أحب ذلك.أنا أعمل مع الكثير من الأحداث :)

هل كانت مفيدة؟

المحلول

كنت حقا بحاجة فقط حدث واحد المستمع في هذه الحالة على أية حال.هذا المستمع سيتم الاستماع لأي تغيير شكل معلمة يساوي ما كان التغيير تصبح متوفرة الحدث المستمع وظيفة.سوف تظهر لك ولكن يرجى تذكر أن هذا هو الزائفة الحالة عادة لا إيفاد الحدث عن شيء بسيط مثل استدعاء الأسلوب لأن الإرسال هو مضمر لذلك ليس هناك حاجة حقيقية للاستماع له.

الأولى مخصصة الحدث


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;
         }
      }
   }      
}

وآمل أن هذا كان مفيدا ، في وقت متأخر وأنا قد تضطر إلى إعادة النظر في بعض الأمور في وقت لاحق, ولكن هذا من شأنه أن يساعد على فهم كيفية جعل الأحداث الخاصة بك وتخصيص كيفية عمل الأشياء.

نصائح أخرى

أنا لا أعرف من أي الروتينية التي تسمح لك أن تفعل ذلك مباشرة, ولكن يمكن أن تكتب الخاصة بك.الجملة هنا لن تكون مثالية, ولكن هنا يمر أولا:

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 );
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top