2015-08-14 66 views
2

我有一個帶有許多指令的大型AngularJS應用程序,其中一些是封裝的activeX控件。

我們遇到的一個問題是,如果用戶在查看activeX控件時註銷,即使我們導航到全新的.html頁面,activeX控件仍保留在頁面上。

我們總是在scope.$on("$destroy"事件中清理我們的指令資源,我希望我可以這樣做:只要確保object標記在銷燬時從頁面中刪除。

我發現的問題是,無論使用哪個指令作爲參考,當使用$window.location.assign重定向到新頁面時,$destroy事件不會被調用。

我也用$window.location.href進行了測試,得到了同樣的結果,沒有$destroy被擊中。

有沒有辦法確保scope.$destroy在頁面重定向時被觸發?

+1

據我所知,範圍沒有得到'$ destroy'事件的最可能原因是如果創建該範圍的指令/控制器沒有被包含在'ng-view'(或指令響應你的路線)HTML元素。如果是這樣的話,你需要做一些手動的工作。這個範圍不在'ngView'下面嗎? – DRobinson

+0

我們在應用程序中所擁有的一切都在ui視圖下。因爲我們使用UI-Router。 – Blunderfest

+0

這些類別的範圍摘要問題有時可以通過將$ destroy包裝在$ timeout中來解決。 – Rorschach120

回答

1

$destroy僅在更改應用程序內的頁面時纔會在離開應用程序時自動觸發。不過,你確實有幾個選擇。

選項1:

這聽起來像你手動觸發與$window.location.assign休假,所以你可以寫一個函數,該函數爲你做:

function destroyAndAssign(path){ 
    $rootScope.$destroy(); 
    $timeout(function(){ 
    $window.location.assign(path); 
    }); 
} 

和揭露說的需要通過服務/提供商進行呼叫的地方。

選項2:

否則,如果你想嘗試強制$destroy每次該應用程序是左,你可以構建應用程序時,請嘗試配置一個window.onbeforeunload事件:

theApp.run(['$rootScope', function($rootScope){ 
    var oldOnLeaveEvent = window.onbeforeunload; 

    window.onbeforeunload = function(){ 
    $rootScope.$destroy(); 
    if(angular.isFunction(oldOnLeaveEvent)){ 
     oldOnLeaveEvent.apply(window, arguments); 
    } 
    }; 
}]); 

然而,在onbeforeunload時間將不可能有各種各樣的東西。