2012-02-17 80 views
1

我正在使用AIR應用程序:如何附加全局事件偵聽器?

主窗口就像儀表板。通過菜單欄,我可以打開其他帶有儀表板詳細信息的窗口。當我關閉這些時,我想刷新主窗口。

我試着用一個事件監聽器,但結果不好。如果我直接從主窗口打開詳細信息窗口,我知道如何添加事件偵聽器 - 並且它可以工作 - 但我不知道該怎麼做,如果詳細信息窗口是從菜單欄打開的!

感謝您的幫助。

+0

我編輯了你的措辭,使你的問題更容易理解 - 我希望我的意思是正確的......你能添加一個你正在嘗試什麼,或者你的事件監聽器不起作用的例子嗎?有些代碼會很好。 – weltraumpirat 2012-02-17 23:03:22

回答

0

您可以通過向其添加事件偵聽器直接偵聽對象(EventDispatcher),或者如果調度器對象位於顯示列表上(如Sprite),則可以在階段級別偵聽捕獲參數設置爲真正。

但主要的警告是,調度員必須在舞臺上爲你抓住這個事件。

你的主窗口監聽級(與捕獲= TRUE):使用舞臺的消息

dispatchEvent(new Event("MY_CUSTOM_EVENT")); 

但(AB):

stage.addEventListener("MY_CUSTOM_EVENT", handle_custom_event, true); 

private function handle_custom_event(e:Event):void 
{ 
    var sub_window:Object = e.target; 
    // do something to your sub_window 
} 

你的子窗口可以分派這樣的活動以這種方式傳遞定製事件的基礎設施有點混亂。如果你真的想要這種通信,你可以考慮一個更正式的消息傳遞架構。即使是一個靜態的MessageBus類,至少可以快速幫助你確定你在代碼庫中使用的地方。無論哪種方式,你都必須小心引用和內存泄漏。

+0

我不認爲單獨的NativeWindows具有相同的階段。 – 2012-02-18 00:44:38

+0

啊,好點。太糟糕了,我不能投我自己的答案。 =) – 2012-02-21 16:59:56

+0

您可以要求將其刪除 – 2012-02-21 18:47:56

2

辛格爾頓是你在找什麼。只需將一個事件調度程序放在裏面,您就可以在應用程序的任何地方收聽。

單例就像在內存中有一個唯一的對象實例,所以任何人修改該對象內的變量(或發送事件通過)將被修改爲每個人。

以下是關於如何使用它的代碼示例。

http://life.neophi.com/danielr/2006/10/singleton_pattern_in_as3.html

注:單身是強大的,並在同一時間的危險,有一個談了很多關於如何使用它們,請閱讀多一點了解,如果你正在考慮建立一個大項目。

希望它有幫助!

1

問題是您正在從視圖執行業務邏輯。不要這樣做。相反,從每個菜單分派一個事件,而不是直接從其中打開窗口。在更高層次上監聽這些事件,然後您可以直接收聽您打開的新窗口,也可以創建一個暴露IEventDispatcher類型變量的基本窗口類。如果您使用同一個事件調度程序填充該變量,那麼您最終得到的結果稱爲「事件總線」,並且您可以監聽事件。

這個架構比使用Singleton需要多一點思考,但是它避免了通過在項目中引入一個緊耦合和其他問題。

相關問題