2016-12-13 71 views
0

我有一個包裝SignalR代理的Angular 1.5服務。當Angular應用程序被銷燬時,我想顯式地離開用戶註冊的所有SignalR組,而不是等待顯式的SignalR超時。Angular 1.5服務的析構函數

我知道,與角1.5倍控制器,我可以聽:

$scope.$on("$destroy", function handler() { ... }); 

但我不知道我是如何「清理」的服務中,並釋放資源,我不再需要。有什麼建議麼?

回答

-1

服務在Angular中是單例的,所以它們沒有像方法那樣的破壞。 我不熟悉SignalR,但是如果他們已經取消訂閱方法,那麼當您不需要偵聽器時,應該調用此方法。

+0

@FunnStuff,這就是蹭 - 我需要打開SignalR通道,直到用戶完成應用程序並從域中導航或關閉瀏覽器。 – zippydev

+0

所以你可以聽窗口onbeforeunload事件 - 當頁面即將被卸載時執行JavaScript(關閉) – Bazinga

0

只需在您的服務中定義一個清潔功能,並在您控制器的時候調用它。

在angular 1.5中,您的組件中還有$ onDestroy。

但是,你不能打賭總是會調用$destroy(可以說用戶殺死瀏覽器),所以你還需要在你的服務器端提供一些解決方案。

+0

由於服務是單例並且在AngularJS應用程序的整個生命週期中都存在,我們不能可靠地調用服務中的析構函數每當一個控制器被摧毀。一個控制器可能在Angular應用程序的生命週期中被實例化和銷燬很多次,但是一個服務將被實例化一次,並且由注入器重用單例引用。我的理解不正確? – zippydev

+0

'當控制器被銷燬時,我們不能可靠地調用服務中的析構函數,您不應該「銷燬」服務,您只需要終止服務爲您提供的資源。您可以使用原子標誌確定服務當前是否提供資源。 [這個問題](http://stackoverflow.com/questions/25131691/angular-using-server-sent-events-in-a-factory)幫助我在角度應用程序中設置服務器發送事件流 – svarog