Flash:使用一个事件侦听器侦听某种类型的所有事件
时间:2020-03-06 14:44:54 来源:igfitidea点击:
这不是生死攸关的问题,但我想知道这是否有可能:
我从一种自定义事件(FormEvent)中获得了几个事件,现在我得到了一个FormListener,它侦听所有这些事件并根据事件类型处理它们。我不想一次添加一个事件监听器,而是希望一次添加所有事件。
所以现在看起来像这样:
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); }
我不知道这样的事情是否可能,我会喜欢的。我处理大量的事件:)
解决方案
我不知道有任何例程可以让我们直接执行此操作,但是我们可以编写自己的例程。这里的语法并不完美,但这是第一步:
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 );
无论如何,我们实际上只需要一个事件侦听器。该侦听器将侦听形式和参数相等的任何更改,该更改等于事件侦听器函数可以使用的更改。我将向我们展示,但请记住,这是一种伪情况,通常我不会从方法调用之类的简单事件中分派事件,因为这暗含了分派,因此没有真正的需要侦听它。
首先是自定义事件
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; } } } }
我希望这会有所帮助,但现在过晚了,也许以后我需要修改一些东西,但这应该有助于了解如何制作自己的事件以及自定义事情的工作方式。