actionscript-3 - 闪存 : Listen to all events of a type with one eventlistener

标签 actionscript-3 events

这不是生死攸关的问题,但我想知道这是否可能:

我从一种类型的自定义事件 (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);
    }

我想知道这样的事情是否可能,我会喜欢的。我处理大量事件:)

最佳答案

无论如何,在这种情况下您真的只需要一个事件监听器。该监听器将监听表单的任何更改,并且参数等于更改对事件监听器函数可用的内容。我将向您展示,但请记住,这是一种伪情况,通常我不会从像方法调用这样简单的事情中分派(dispatch)事件,因为分派(dispatch)是隐含的,因此没有真正需要监听它。

首先是自定义事件


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

所以我们刚刚创建了我们的自定义事件类并设置了它,以便我们可以通过监听器函数捕获状态,正如我将演示的那样,一旦完成了将分派(dispatch)所述自定义事件的伪表单类。

请记住,这都是假设,因为我不知道您的代码是什么样的,也不知道您是如何实现的。重要的是要注意,当我分派(dispatch)事件时,我需要发送一个反射(reflect)新状态的参数。


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

我希望这对您有所帮助,虽然来晚了,我以后可能不得不修改一些内容,但这应该有助于了解如何制作您自己的事件以及自定义事件的运作方式。

关于actionscript-3 - 闪存 : Listen to all events of a type with one eventlistener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/135938/

相关文章:

events - 为什么 Ext.form.Field.setValue() 不触发事件? "fix"怎么办呢?

c# - MouseLeftButtonUp 不触发

jQuery 单击事件未触发 - ios 主屏幕 Web 应用程序

apache-flex - 如何在 Flex 中以编程方式拖放 Sprite?

actionscript-3 - 漏洞? AIR 中的 LoaderInfo getLoaderInfoByDefinition 安全沙箱违规

actionscript-3 - AS3 AIR URLLoader POST

JavaScript 事件模型

actionscript-3 - 从 ActionScript 3 的完整路径中提取 "filename"

php - 如何将变量从 PHP 传递到 Flash (ActionScript 3)

jquery - 在 jQuery 中触发 keyup 事件