2008-09-25 56 views
3

这不是生死攸关的问题,但我不知道这可能是可能的:快讯:听一个类型的所有事件与一个事件侦听

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

时添加的每一个事件之一,但我不知道这样的事情是可能的, 我会喜欢它。我与大量的事件:)

回答

7

真正需要的只是一个事件侦听器,在这种情况下,无论如何。该监听器将监听窗体和参数的任何更改,该参数等于事件监听器函数可用的更改。我会告诉你,但是请记住,这是一种伪造的情况,通常我不会像一个方法调用那样简单地发送一个事件,因为调度是隐含的,所以没有真正的需要去监听它。

首先自定义事件


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

我希望这是有帮助的,它的后期,我也可以以后修改一些东西,但是这应该有助于获得如何使自己的活动的理解和定制的东西是如何工作的。

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