2015-04-04 91 views
3

http://plnkr.co/edit/UfQJU661pQR0DMY3c61t?p=previewAngularjs銷燬工作不

我上面的代碼中得到了AngularJs網站和唯一的事情我添加了一個按鈕來刪除一個DIV,我們有控制器,但是之後刪除不破壞方法被稱爲我已經指令放警報和控制器。

element.on('$destroy', function() { 
alert('destroy directive interval'); 
$interval.cancel(stopTime); 
}); 

$scope.$on('$destroy', function() { 
alert('destroy controller interval'); 
// Make sure that the interval is destroyed too 
$scope.stopFight(); 
}); 

請建議。

謝謝

回答

0

你正在做的角度的上下文以外。

<button id="btn" onclick="DeleteMainDiv()">DeleteDiv</button> 

所以在你DeleteMainDiv()功能

function DeleteMainDiv() { 
     alert('Controller div going to remove'); 
     //debugger; 
     var scope = angular.element(document.getElementById("mainDiv")).scope(); 
     $('#mainDiv').remove(); 
     scope.$destroy(); 
    } 

這將觸發破壞功能。

但我沒有看到它的需要。當路線更改或指令不再需要時,Angular將自動運行事件處理程序。

DEMO

+0

你不覺得嗎? Angular應該在場景後面添加監視器,因爲Angular知道我們要添加控制器或指令的元素是什麼。 – 2015-04-04 12:50:22

+0

跟蹤所有DOM元素將變得非常忙碌。已經有很多關於angular的$ digest循環的爭論,因爲它降低了角度的性能。這就是Angular 2.0的原因,他們用ES6觀察屬性完全重寫摘要循環。如果angular必須跟蹤所有的DOM $ destroy事件,那麼這將是一個性能問題。但是當路線改變時它會發生。就你而言,你已經手動刪除了DOM元素,所以它不知道它,因爲範圍仍然有效。 – mohamedrias 2015-04-04 12:56:08

0

最主要要注意

element.remove()被執行的元件和其所有子將從DOM一起被移除將通過例如element.on附所有事件處理程序。

它不會銷燬與該元素相關的$範圍。

所以你需要手動觸發範圍$ destroy();

首先獲得元素的範圍: -

var scope = angular.element(document.getElementById("mainDiv")).scope(); 

其次從DOM刪除元素: -

$('#mainDiv').remove(); 

三手動破壞範圍: -

scope.$destroy(); 

Plunker

+1

@mohamedrias不正是我首先解釋了爲什麼它不觸發銷燬事件,因爲element.remove()銷燬所有事件,包括'on'事件,這就是爲什麼它不觸發銷燬事件。然後我解釋你的答案線:-P謝謝:) – squiroid 2015-04-04 05:10:05

+0

所以這是一個錯誤。由於角度知道我們要添加控制器和指令的元素,所以它可以添加DOM刪除事件。 – 2015-04-04 12:45:44

+0

沒有一個錯誤是不可能的(或者可能我不確定)角度傾聽所有dom刪除事件:) – squiroid 2015-04-04 12:47:38