AngularJS - 何时删除由 $scope.$new() 创建的范围。垃圾收集器或 Angular 会处理它吗?

AngularJS - When does a scope created by $scope.$new() removed. Does the garbage collector or Angular takes care of it?

我想知道如何在下面的场景中删除由 $scope.$new() 创建的范围。

我的场景 - $scope.$new() 创建了一个新范围,向其添加了一些属性并将其传递给 angular 脚本模板

<script type="text/ng-template" id="row-details.html">
<tr><td>code</td></tr>
</script>

动态创建一个新的 table 行。所以在我的例子中,每个 <tr> 行都有一个新的范围。每当在 html table.

中双击行或列时,我都会即时创建 table 行

现在在某些事件上,例如 - 'double click' 在某些父行或列或任何地方,我删除了这个新行,它是通过模板创建的,具有新范围,通过 $scope.$new(),我的问题是,这是否也会删除对 $scope.$new() 范围的引用,或者我将不得不手动删除它,或者在某个时候垃圾收集器将删除它,因为 table 正在使用它的行已从 DOM.

中删除

以上的总体问题是我想确保应用程序中没有内存泄漏。

所以总的来说我有两个问题-

  1. 一旦相关的 DOM 行从 DOM.
  2. 中删除,angular 或垃圾收集器是否会自动删除新范围?
  3. 如何通过 Chrome Dev Tools 或任何其他方式测试此引用是否已删除,并且该特定代码没有内存泄漏。

如果您需要更多详细信息,请告诉我。 谢谢!

当有人调用它的 $destroy 方法时,范围被删除。

当它的祖先之一被移除时,范围也会被移除。

“删除”意味着作用域及其子作用域将不再接收摘要调用,此外,应该进行垃圾收集。

来自 $new$destroy 方法范围的 documentation

$new(isolate, parent);

Creates a new child scope.

The parent scope will propagate the $digest() event. The scope can be removed from the scope hierarchy using $destroy().

$destroy() must be called on a scope when it is desired for the scope and its child scopes to be permanently detached from the parent and thus stop participating in model change detection and listener notification by invoking.

$destroy();

Removes the current scope (and all of its children) from the parent scope. Removal implies that calls to $digest() will no longer propagate to the current scope and its children. Removal also implies that the current scope is eligible for garbage collection.

具体来说,对于您的问题,您必须在您创建的子作用域上调用 $destroy。仅删除 DOM 元素不会触发它 - 子作用域仍在作用域层次结构中并具有对它的引用。

plunker - 用于说明