Zalecam przeczytanie oficjalnej szczegółowej dokumentacji Angulara dla lunet. Rozpocznij od sekcji „Hierarchie zakresu”:
https://docs.angularjs.org/guide/scope
Zasadniczo, $ rootScope i $ scope identyfikują określone części DOM, w ramach którego
- Wykonywane są operacje kątowe
- dostępne są zmienne zadeklarowane jako część $ rootScope lub $ scope
Wszystko, co należy do $ rootScope, jest dostępne globalnie w twojej aplikacji Angular, podczas gdy wszystko, co należy do $ scope, jest dostępne w części DOM, do której ma zastosowanie ten zakres.
$ RootScope jest stosowany do elementu DOM, który jest elementem głównym aplikacji Angular (stąd nazwa $ rootScope). Po dodaniu dyrektywy ng-app do elementu DOM, staje się ona głównym elementem DOM, w którym dostępny jest $ rootScope. Innymi słowy, właściwości itp. $ RootScope będą dostępne w całej aplikacji Angular.
Zakres Angular $ (i wszystkie jego zmienne i operacje) jest dostępny dla określonego podzbioru DOM w Twojej aplikacji. W szczególności zakres $ scope dla dowolnego konkretnego kontrolera jest dostępny dla części DOM, do której ten konkretny kontroler został zastosowany (przy użyciu dyrektywy ng-controller). Należy jednak zauważyć, że niektóre dyrektywy, np. Ng-powtórzenie, zastosowane w części DOM, w której zastosowano kontroler, mogą tworzyć zakresy potomne zakresu głównego - w ramach tego samego kontrolera - kontroler niekoniecznie zawiera tylko jeden zakres.
Jeśli spojrzysz na wygenerowany kod HTML po uruchomieniu aplikacji Angular, możesz łatwo zobaczyć, które elementy DOM „zawierają” zakres, ponieważ Angular dodaje klasę ng-scope do każdego elementu, do którego został zastosowany zakres (w tym element główny aplikacji, która ma $ rootScope).
Nawiasem mówiąc, znak '$' na początku $ scope i $ rootScope jest po prostu identyfikatorem w Angular dla rzeczy zarezerwowanych przez Angular.
Zauważ, że używanie $ rootScope do udostępniania zmiennych itp. Między modułami i kontrolerami nie jest ogólnie uważane za najlepszą praktykę. Deweloperzy JavaScript mówią o unikaniu „zanieczyszczenia” zasięgu globalnego poprzez udostępnianie tam zmiennych, ponieważ później mogą wystąpić konflikty, jeśli zmienna o tej samej nazwie zostanie użyta w innym miejscu, a deweloper nie zdaje sobie sprawy, że jest już zadeklarowana w $ rootScope. Znaczenie tego rośnie wraz z rozmiarem aplikacji i zespołem, który ją opracowuje. Idealnie byłoby, gdyby $ rootScope zawierało tylko stałe lub zmienne statyczne, które mają być zawsze spójne w całej aplikacji. Lepszym sposobem dzielenia się materiałami między modułami może być korzystanie z usług i fabryk, co jest innym tematem!