2012-08-15 63 views
1

這已經讓我煩惱幾天了。我寫了一個多功能的messageBox類,它工作得很好,但有一件事我堅持。首先,雖然,這裏的一些代碼:AS3將一個回調函數傳遞給一個類構造函數,以便與addEventListener一起使用

文檔類我:

var tMsg:Msg = new Msg("Test Message", "This is a test Message", Msg.INPUT); 

tMsg.addEventListener('Answered', qa, false, 0, true); 

function qa(e:Event):void{ 
    trace(e.target.label,e.target.result); 
    tLabel.label = e.target.result; 
} 

時,無論是「取消」或「確定」按鈕被點擊,結果屬性設置和「回答」事件被派遣。由於這個事件監聽器總是需要添加,所以我認爲將它包含在類構造函數中會更好;但是,Msg類的每個實例都需要自己的回調,具體取決於結果的用途。此外,回調函數應該在文檔類中聲明。

我認爲這可以通過簡單地將函數傳遞給Msg類構造函數來完成,然後使用該引用來動態生成addEventListener。 例如:

/// in document class 
var tMsg:Msg = new Msg("Test Message", "This is a test Message", Msg.INPUT, qa); 

function qa(e:Event):void{ 
    trace(e.target.label,e.target.result); 
    tLabel.label = e.target.result; 
} 

/// in Msg class 
public function Msg(txt:String='', msg:String='', type:String=ALERT, callback:Object=null) { 
    _callback = callback; 
    addEventListener(Event.ADDED, setup, false, 0, true); 
} 
private function setup(e:Event){ 
    stage.addEventListener('Answered', _callback, false, 0, true); 
} 

這是行不通的。我不知道是否因爲我試圖存儲回調引用(事件監聽器應該添加到舞臺對象中)還是什麼?獲得這個工作的好處是我不必在每次創建新消息時添加事件偵聽器,只需傳遞相關函數。

非常感謝您提供給我的任何幫助。

回答

1

您應該將事件偵聽器添加到調度事件的對象。如果該對象不在顯示列表中,或者事件不冒泡,那麼該舞臺將不會收到該事件。

+0

好吧,現在我正式覺得啞巴了。我忘了泡它。它現在完全有效。 – 2012-08-15 08:22:22

相關問題