Я рекомендую вам прочитать официальную подробную документацию по Angular для областей видимости. Начните с раздела «Иерархии областей видимости»:
https://docs.angularjs.org/guide/scope
По сути, $ rootScope и $ scope определяют определенные части DOM, внутри которых
- Угловые операции выполняются
- переменные, объявленные как часть $ rootScope или $ scope, доступны
Все, что принадлежит $ rootScope, доступно глобально в вашем приложении Angular, тогда как все, что принадлежит $ scope, доступно в той части DOM, к которой применяется эта область.
$ RootScope применяется к элементу DOM, который является корневым элементом для приложения Angular (отсюда и название $ rootScope). Когда вы добавляете директиву ng-app к элементу DOM, он становится корневым элементом DOM, в котором доступен $ rootScope. Другими словами, свойства и т. Д. $ RootScope будут доступны во всем вашем приложении Angular.
Область Angular $ (и все ее переменные и операции) доступна для определенного подмножества DOM в вашем приложении. В частности, $ scope для любого конкретного контроллера доступна той части DOM, к которой был применен этот конкретный контроллер (с помощью директивы ng-controller). Однако обратите внимание, что определенные директивы, например, ng-repeat, при применении в той части DOM, где был применен контроллер, могут создавать дочерние области основной области - в пределах одного контроллера - контроллер не обязательно содержит только одну область.
Если вы посмотрите на сгенерированный HTML-код при запуске приложения Angular, вы легко увидите, какие элементы DOM «содержат» область видимости, поскольку Angular добавляет класс ng-scope к любому элементу, к которому была применена область (включая корневой элемент приложения, имеющего $ rootScope).
Кстати, знак «$» в начале $ scope и $ rootScope - это просто идентификатор в Angular для вещей, которые зарезервированы Angular.
Обратите внимание, что использование $ rootScope для обмена переменными и т. Д. Между модулями и контроллерами обычно не считается лучшей практикой. Разработчики JavaScript говорят о том, чтобы избежать «загрязнения» глобальной области видимости путем совместного использования переменных в ней, поскольку позже могут возникнуть конфликты, если переменная с тем же именем будет использоваться где-то еще, без того, чтобы разработчик осознал, что она уже объявлена в $ rootScope. Важность этого возрастает с увеличением размера приложения и команды, которая его разрабатывает. В идеале $ rootScope будет содержать только константы или статические переменные, которые должны быть постоянными во всем приложении. Лучшим способом обмена данными между модулями может быть использование сервисов и фабрик, что является другой темой!