2015-09-15 57 views
3

我是新来的角,所以也许我正在做这个完全错误的。我正在尝试使用angularJS指令创建一个treeView。我迄今为止的代码完成了这一点,除了每次树视图重新加载时都会出现内存泄漏,并最终导致浏览器崩溃。AngularJS中的内存管理

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

fiddler有我的消息来源,它建立你一个随机的树,让您可以选择在树节点的量的能力。如果你将这个数字提高到一个更高的数字,并重新加载多次,你会注意到它逐渐减慢到每次。

任何关于如何清理自己的想法将不胜感激,谢谢。

编辑:

fiddler是这一个我在一个完全不同的方向去进行第二次尝试。它更有效率,而且我认为代码更干净。但是,这个也有问题。周期性地,并且看起来随机地刷新树,这引发无限的摘要异常。

注意:并非前一树中的所有功能都在当前树中。那是因为我还没有编程。

+2

我不认为范围会被破坏......我在'element.on('remove'')中放置了一个断点,但我无法触发它 – Jorg

+0

我注意到了同样的事情,但无法理解为什么,有什么想法? – Jesse

+0

我已经在'jscTreeNode'处添加了一个'template.on(“remove”...'),并且在速度和内存消耗方面情况都有所好转,但仍然很差完美 –

回答

1

正如评论中的讨论所指出的那样,我在树视图中创建了,但从未正确释放范围。虽然这个解决方案并不是很容易解决,但它确实是一个非常简单的解决方案,并且为我澄清了很多事情。

我需要做的是对我的树的根范围进行克隆var newScope = scope.$new();,然后我构建了所有其余子树及其相关节点,并使用克隆范围newScope进行编译。编译后,将克隆的范围存储到指令lastScope = newScope;的私有变量中。当watch属性更新并回调我的指令时,最后一个克隆范围被销毁lastScope.$destroy();。销毁克隆范围会自动销毁在其下创建的任何子范围(节点以及子树)。创建范围的新克隆,并重复这个过程,感谢@ Jorg的工具来计算范围,我可以看到每次迭代都能很好地清理所有内容。这是解决方案的fiddle