2008-09-25 52 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);