Flash: прослушивание всех событий типа с одним EventListener - PullRequest
3 голосов
/ 26 сентября 2008

Это не вопрос жизни или смерти, но мне интересно, возможно ли это:

Я получил пару событий из одного типа пользовательского события (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);
    }

Интересно, возможно ли что-то подобное, мне бы это понравилось. Я работаю с кучей событий:)

Ответы [ 2 ]

7 голосов
/ 26 сентября 2008

В любом случае вам действительно нужен только один прослушиватель событий. Этот слушатель будет прослушивать любое изменение с формой, а параметр, равный тому, что было изменением, становится доступным для функции прослушивателя событий. Я покажу вам, но, пожалуйста, помните, что это псевдо-ситуация, и обычно я бы не отправлял событие из чего-то столь же простого, как вызов метода, потому что подразумевается диспетчеризация, поэтому нет реальной необходимости его слушать.

Первое пользовательское событие


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

Итак, мы только что создали наш пользовательский класс событий и настроили его так, чтобы мы могли перехватывать состояние через функцию слушателя, как я покажу, как только будет сделано с классом псевдоформы, который будет отправлять указанное пользовательское событие. 1006 *

Помните, что все это гипотетически, поскольку я понятия не имею, как выглядит ваш код или как вы его реализуете. Важно отметить, что когда я отправляю событие, мне нужно отправить с ним параметр, который отражает новое состояние.


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

Я надеюсь, что это было полезно, уже поздно, и мне, возможно, придется пересмотреть некоторые вещи позже, но это должно помочь понять, как проводить свои собственные события и настраивать, как все работает.

0 голосов
/ 26 сентября 2008

Я не знаю ни одной подпрограммы, которая позволяла бы вам делать это напрямую, но вы могли бы написать свою собственную. Синтаксис здесь не будет идеальным, но вот первый проход:

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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...