2013-06-05 10 views
20

Podczas korzystania z ngView z powiedzeniem 100 różnych widoków, każdy z innym zakresem. Czy Angular automatycznie obsługuje niszczenie starych szablonów/zakresów lub czy pozostają one w pamięci? Ciekaw jestem tylko, czy Angular sam sobie z tym poradzi zanim pójdę i zacznie pisać niestandardowy kod, by zmniejszyć obciążenie pamięci. W tej chwili każdy nowy widok, który widzę, po prostu układa się w pamięci.W jaki sposób Angularjs obsługuje zarządzanie pamięcią za pomocą ngView?

To jest pytanie specyficzne dla AngularJS. Wiem, jak działa garbage collection w javascript.

+5

Tak, js ma zbierania śmieci. Ale nie będzie zbierać niczego, co według niego jest w użyciu. W kanciastym założeniu zakłada się, że $ zakresy są nadal w użyciu, więc nigdy go nie zgromadzą. Pytam więc, co mam zrobić w Angular, aby upewnić się, że można je zebrać. – mfrancis107

+0

Zawsze możesz użyć "usuń"? –

+0

@KGChristensen Nie tak działa "usuwanie"? – rounce

Odpowiedz

22

Jedną z decyzji konstrukcyjnych stojących za wprowadzeniem zakresów było ułatwienie zarządzania pamięcią. Dzieląc przestrzeń modelu na pod-części (zakresy), możemy usunąć niepotrzebne części modelu (zakres) i dodać nowe w razie potrzeby. Więc tak, zakresy są ważną częścią całej logiki zarządzania pamięcią.

Jeśli chodzi o konkretne pytanie dotyczące ng-view - ta dyrektywa będzie nadal dotyczyć tylko aktywnego widoku . ng-view jest jedną z dyrektyw tworzenia zakresu (i zakresu niszczenia!). Automatycznie utworzy nowy zakres, do którego nawiguje nowy widok, i automatycznie zniszczy zakres związany ze starym widokiem. Można to łatwo sprawdzić w AngularJS source code.

Jedyną zajmującą dużo pamięci częścią do rozważenia są szablony pobrane przez sieć. Wszystkie szablony wymienione na trasie są buforowane w $templateCache. Możesz eksmitować szablony, używając oszczędnie, jeśli stwierdzisz, że radzi sobie z konkretnym wąskim gardłem w Twojej aplikacji. Musimy tylko uświadomić sobie, że jest to czas handlu (czas sieci) na zużycie pamięci.

W skrócie: nie trzeba wdrażać własnego zarządzania zakresami dla ng-view - jeśli zauważysz jakiekolwiek zatrzymanie zasięgu, powinno zostać zgłoszone jako błąd.

+0

A co z HTML-em szablonu? Wiem, że to zachowuje, ponieważ nigdy nie robi kolejne żądanie ajax dla szablonu? – mfrancis107

+0

Tak, wszystkie pobrane szablony są umieszczane w '$ templateCache': http://docs.angularjs.org/api/ng.$templateCache Możesz je wyrzucić podczas zdarzenia zmiany trasy. Zaktualizowano odpowiedź. –

+1

hi @ pkozlowski.opensource co z dyrektywami zdefiniowanymi przez użytkownika, które tworzą izolowane zakresy? –