2015-09-15 60 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