2013-06-05 37 views
20

當你使用ngView時,說100個不同的視圖,每個視圖有不同的範圍。 Angular會自動處理銷燬舊模板/範圍還是留在內存中?我只是好奇,如果在我去之前Angular自己處理這個問題,並開始編寫自定義代碼來減少內存負載。到目前爲止,我所看到的每個新視圖都只是堆在內存中。Angularjs如何使用ngView處理內存管理?

這是一個AngularJS的具體問題。我知道垃圾收集如何在JavaScript中工作。

+5

是的,js有垃圾回收。但它不會收集任何它認爲正在使用的東西。使用角度,它假定$範圍仍在使用中,因此它永遠不會收集它。所以我在問如何在Angular中做些什麼來確保它能被收集。 – mfrancis107

+0

你可以隨時使用「刪除」? –

+0

@KGChristensen這不是'delete'的工作方式嗎? – rounce

回答

22

引入範圍的設計決定之一是簡化內存管理。通過將模型的空間劃分爲子部分(範圍),我們可以移除模型的不需要的部分(範圍)並在需要時添加新的部分。所以是的,範圍是整個內存管理難題的重要組成部分。

當涉及到您關於ng-view的具體問題時 - 此指令僅保留當前活動視圖的範圍。 ng-view是範圍創建(和範圍銷燬!)指令之一。它會自動創建一個新的範圍,當一個新的視圖導航到,並將自動銷燬與舊視圖連接的範圍。這可以在AngularJS source code中輕鬆驗證。

唯一需要考慮的內存消耗部分是通過網絡獲取的模板。路由中引用的所有模板都緩存在$templateCache中。如果您確定它能夠解決應用程序中的特定perf性能瓶頸,那麼可以謹慎使用模板。我們只需要認識到它是內存消耗的交易時間(網絡時間)。

簡而言之:沒有必要推出自己的範圍,管理爲ng-view - 如果你看到它應該被報告爲錯誤的任何範圍的保留。

+0

模板的html怎麼樣?我知道這是因爲它永遠不會爲模板做另一個Ajax請求? – mfrancis107

+0

是的,所有提取的模板都放在'$ templateCache'中:http://docs.angularjs.org/api/ng.$templateCache你可以將這些路由改變事件驅逐出去。更新了答案。 –

+1

hi @ pkozlowski.opensource那些創建隔離範圍的用戶定義指令呢? –