AngularJS中的内存管理

AngularJS中的内存管理,angularjs,angularjs-directive,angularjs-scope,Angularjs,Angularjs Directive,Angularjs Scope,我是个新手,所以我可能完全错了。我正试图用angularJS指令制作一个树状视图。到目前为止,我使用的代码实现了这一点,除了每次树视图重新加载时都会出现内存泄漏,最终导致浏览器崩溃 我创建了以下两条指令来完成我的任务jscTreeView和jscTreeNode 这是我的源代码,它构建了一个随机树,并使您能够选择树中的节点数量。如果你把这个数字增加到一个更高的数字,并重新加载几次,你会注意到它每次都会逐渐变慢 如果您有任何关于我之后如何清理的想法,我们将不胜感激,谢谢 编辑: 这是我的第二次尝试

我是个新手,所以我可能完全错了。我正试图用angularJS指令制作一个树状视图。到目前为止,我使用的代码实现了这一点,除了每次树视图重新加载时都会出现内存泄漏,最终导致浏览器崩溃

我创建了以下两条指令来完成我的任务
jscTreeView
jscTreeNode

这是我的源代码,它构建了一个随机树,并使您能够选择树中的节点数量。如果你把这个数字增加到一个更高的数字,并重新加载几次,你会注意到它每次都会逐渐变慢

如果您有任何关于我之后如何清理的想法,我们将不胜感激,谢谢

编辑:

这是我的第二次尝试,我的方向完全不同。在我看来,它更高效,代码也更干净。然而,这一个也有一个问题。在刷新树时,这个异常会周期性地(看起来是随机的)抛出一个无限摘要异常


注意:并非前一个树中的所有功能都在当前树中。这只是因为我还没有对其进行编程。

正如评论中的讨论所示,我在树视图中创建了作用域,但从未正确地发布过。虽然这个解决方案不是很容易弄清楚,但它实际上是一个相当简单的解决方案,并且对我来说澄清了很多事情


我需要做的是克隆我的树的根作用域
var newScope=scope.$new(),然后我构建了所有其余的子树以及它们的关联节点,并使用克隆的作用域
newScope
进行编译。编译后,它将克隆的作用域存储到指令
lastScope=newScope的私有变量中。更新watch属性并调用my指令时,最后一个克隆的作用域将被销毁
lastScope.$destroy()。销毁克隆的作用域会自动销毁在其下创建的任何子作用域(节点以及子树)。创建了作用域的新克隆,并重复了该过程,多亏了@Jorg的计算作用域的工具,我可以看到每一次迭代都很好地清理了一切。这是解决方案的一个简单例子。

我认为范围永远不会被破坏。。。我在
元素中放置了一个断点。在('remove'
事件上,但我无法触发它。我注意到了同样的事情,但不明白为什么,有什么想法吗?我添加了一个
模板。在('remove')上…
jscTreeNode
上,这里的速度和内存消耗都有所提高,但还远远不够完美。如果树的深度大于等于十层,则会出现无限摘要错误。我刚刚添加了一个函数。请查看并检查控制台…包含的作用域数。我认为您对树的深度的看法是正确的。它是一个你们可以知道的数字。请看页面底部。