2010-08-11 185 views
1

我在flex 3.5中創建了一個自定義事件。但是處理程序沒有被調用。如何解決這個問題或者調試這個問題的方法是什麼?Flex事件處理程序不工作

Event類:

package com.saneef.worldlanguages.events 
{ 
    import flash.events.Event; 

    public class LanguageEvent extends Event 
    { 
     public static const LANGUAGE_SELECTED:String = "LanguageSelected"; 

     public function LanguageEvent(type:String,languageid:String) 
     { 
      super(type); 
      this.langid = languageid; 
      trace("LanguageEvent: " + this.langid); 
     } 

     public var langid:String; 

     override public function clone():Event { 
      return new LanguageEvent(type, langid); 
     } 
    } 
} 

調度:

private function functionOne():void 
{  
    try{ 
     dispatchEvent(new LanguageEvent(LanguageEvent.LANGUAGE_SELECTED,"STR")); 
    } 
    catch(e:Error) 
    { 
     trace(e.message); 
    } 
} 

在主應用程序類,事件監聽:

protected function application1_initializeHandler(event:FlexEvent):void 
{ 
    this.addEventListener(LanguageEvent.LANGUAGE_SELECTED, 
application1_LanguageSelectionHandler); 
} 

的事件處理函數:

public function application1_LanguageSelectionHandler(event:LanguageEvent):void 
{ 
    trace("application1_LanguageSelectionHandler: " + event.langid); 
    populate_countrya3id_languages(event.langid); 
} 

回答

3

你的代碼看起來不錯。既然不能看到完整的源代碼,這裏有我什麼兩個念頭可能正在進行:

  1. 你確定你發送的事件之前,您addEventListener調用完成?添加一些痕跡以確保在functionOne之前打印application1_initializeHandler

  2. 你的functionOne調用另一個不同於你的主應用程序的組件嗎?如果是這樣,您需要在事件的超級通話中將自定義事件的bubbles屬性設置爲true。

    public function LanguageEvent(type:String,languageid:String,bubbles:Boolean=True) 
    { 
        super(type, bubbles); 
        this.langid = languageid; 
        trace("LanguageEvent: " + this.langid); 
    } 
    

flash.events.Event文檔的構造函數調用。此外,這裏有一個報價有關bubbles參數解釋here:這意味着

氣泡屬性

如果 事件對象在事件流的 冒泡階段參與的事件是對氣泡所述, 事件對象是 ,通過它的祖先從目標節點返回 ,直到達到舞臺的 。 Event.bubbles屬性 存儲一個布爾值,該值指示 事件對象是否在冒泡階段參與 。由於所有 事件都會冒泡並參與捕獲和目標階段,所有事件都會參與所有事件流程階段的所有事件。如果 值爲true,則事件對象 將參與所有三個階段。如果 的值爲false,則事件對象 不參與冒泡 階段。

根據你的源代碼,它看起來像你見過在Flex文檔的「調度自定義事件」,但我會鏈接到它反正對未來/方便參考:http://livedocs.adobe.com/flex/3/html/help.html?content=createevents_3.html

另外,請查看http://www.adnandoric.com/2008/12/29/understanding-the-flex-event-propagation/以瞭解事件傳播系統的高級概述,以便更好地瞭解開發過程中發生的情況。

編輯:

根據您的意見我猜你的functionOne通話是在一個單獨的類和你的「主」的應用程序有這個類的一個實例。如果是這樣的,所以你要附加在該實例上的事件偵聽器,並將其委託給你的主要的application1_LanguageSelectionHandler功能......像這樣:

protected function application1_initializeHandler(event:FlexEvent):void 
{ 
    this.theInstanceThatHoldsYourFunctionOne.addEventListener(LanguageEvent.LANGUAGE_SELECTED, 
application1_LanguageSelectionHandler); 
} 
+0

「的addEventListener」的事件被分派前執行。我已跟蹤測試過。 正如你懷疑「functionOne」在主應用程序以外的其他類中。正如你所建議的那樣,我在超級類的構造函數中添加了「bubbles = true」。但它仍然不起作用。我將通過您提供的鏈接並嘗試更多的調試。 :) – Saneef 2010-08-11 19:45:06

+1

@Saneef:根據你的評論我已經更新了我的答案......看看它是否能爲你解決。 – sdolan 2010-08-11 19:53:15

+0

@sdolan它的工作。 :) 謝謝!現在,即使將事件偵聽器添加到主應用程序(就像我之前所做的那樣),我仍然懷疑,在事件傳播(如adnandoric.com中顯示的事件傳播)中不會調用它嗎? – Saneef 2010-08-11 20:11:33