jdo*_*dot 8 javascript destroy angularjs angularjs-scope
今天遇到了一个非常"陷入困境"的Angular问题,我无法找到答案.从$scope
文档中,您可以注册一个事件处理程序"$destroy"
,在作用域的销毁之前调用它.这样,您可以取消注册事件处理程序,如下所示:
var deregister = $scope.$on('myCustomEvent', function () {
// do some crazy stuff
});
$scope.$on('$destroy', function () {
deregister();
});
Run Code Online (Sandbox Code Playgroud)
但是,$scope.$on('$destroy', ...)
必须创建自己的处理程序.这是自动销毁,还是你必须做以下的事情来销毁它?
var deregister = $scope.$on('myCustomEvent', function () {
// do some crazy stuff
});
var deregisterDestroy = $scope.$on('$destroy', function () {
deregister();
deregisterDestroy();
});
Run Code Online (Sandbox Code Playgroud)
答案实际上是“也许”,具体取决于您所说的自动销毁的意思。如果我们查看$destroy
作用域方法的源代码,我们可以看到,虽然$destroy
事件在整个子作用域中向下广播,但实际的$destroy
方法永远不会在除初始作用域之外的任何作用域上调用。这意味着实际的属性清理和清空操作永远不会发生在子作用域上。
这不会泄漏内存的原因是,一旦$destroy
在作用域上调用,它就会与父作用域分离,因此有资格进行垃圾回收,因为它不再有任何到 GC 根的路径。同样的逻辑适用于所有子作用域,因为它们也不应该有到 GC 根的路径。
不过你的例子是安全的;我自己以同样的方式在必要时清理我自己的处理程序,并且不会遇到任何类型的无限循环。
归档时间: |
|
查看次数: |
1186 次 |
最近记录: |