穿过一个非常小的洞穴#34;今天的角度问题我无法找到答案。在$scope
文档中,您可以在"$destroy"
上注册一个事件处理程序,该事件处理程序在范围销毁之前调用。这样,您可以取消注册事件处理程序,如下所示:
var deregister = $scope.$on('myCustomEvent', function () {
// do some crazy stuff
});
$scope.$on('$destroy', function () {
deregister();
});
但是,$scope.$on('$destroy', ...)
必须创建自己的处理程序。这是自动销毁,还是你必须做以下的事情来销毁它?
var deregister = $scope.$on('myCustomEvent', function () {
// do some crazy stuff
});
var deregisterDestroy = $scope.$on('$destroy', function () {
deregister();
deregisterDestroy();
});
答案 0 :(得分:1)
答案实际上是“可能”,取决于你被自动销毁的意思。如果我们查看范围的$destroy
方法的源代码,我们可以看到,在整个子范围内向下广播$destroy
事件时,实际的$destroy
方法永远不会在任何范围内调用但最初的一个。这意味着实际的清理和属性的清除永远不会发生在子范围上。
这不会泄漏内存的原因是因为一旦在作用域上调用了$destroy
,它就会与父作用域分离,因此它有资格进行垃圾回收,因为它应该不再有任何GC根路径。同样的逻辑适用于所有子范围,因为它们也没有到GC根目录的路径。
你的例子是安全的;我自己也是这样做的,以便在必要时清理我自己的处理程序,并且不会遇到任何类型的无限循环。