我知道应该使用$ destroy来避免内存泄漏,但是当发生此类泄漏时,不清楚什么是精确和确定的案例列表。
何时应该在范围内调用$ destory?
这个问题不是关于$ destroy是否删除了事件监听器。当有人故意调用$ destroy()方法时,这是一个问题列表的问题。此问题也不是$ on('$ destroy')。
答案 0 :(得分:1)
Imho是最重要的情况,你应该释放$ destroy上的资源就是删除使用addEventListener()设置的事件监听器。另一种情况是setTimeout / setInterval调用,它们不被Angular跟踪为$ timeout和$ interval服务,因此可能导致内存泄漏。
事实上,你不应该调用$ destroy,而是通过调用
$scope.$on('$destroy', function(){});
并释放传递函数内的所有重要资源。
答案 1 :(得分:1)
我不太确定这是否能回答你的问题,但也许这会对你有帮助。
当应用程序加载到浏览器中时,范围数据会经历生命周期。
5阶段是
1) 创建 - 根范围是在$ injector注入应用程序引导期间创建的。在模板链接期间,指令(不是全部)创建新的子范围。
2)观察者注册 - 在模板链接期间,指令寄存器监视范围。这些观察者将用于将模型值传播到DOM。
3)模型突变 - 要正确观察突变,您应该只在范围内进行。$ apply()。 Angular API隐式执行此操作,因此在控制器中执行同步工作时不需要额外的$ apply调用,或者使用$ http,$ timeout或$ interval服务进行异步工作。
4)变异观察 - 在$ apply()结束时,Angular在$ rootscope上执行$ digest循环,然后传播到所有子范围。在$ digest循环期间,检查所有$ watchched表达式或函数的模型变异,如果检测到变异,则调用$ watch监听器。
5)范围销毁 - 当不再需要子范围时,子范围创建者有责任通过范围销毁它们。$ destroy()API。这样做是为了阻止$ digest调用传播到子作用域,并允许垃圾收集器回收子作用域模型使用的内存。
我想我有点试图回答你的问题。希望它有所帮助:)