I see in controllers that $scope has $root, what is this? How is it different from $rootScope which can be injected in the controller?
Root ScopeAll applications have a $rootScope which is the scope created on the HTML element that contains the ng-app directive. The rootScope is available in the entire application. If a variable has the same name in both the current scope and in the rootScope, the application uses the one in the current scope.
$scope is a JavaScript object that refers to the application data. It has properties and methods attached to it that are available for both the view and the controller. So, we can say that $scope is the binding part between the HTML view and the JavaScript controller.
The $ in "$scope" indicates that the scope value is being injected into the current context. $scope is a service provided by $scopeProvider . You can inject it into controllers, directives or other services using Angular's built-in dependency injector: module.
An app can have only one $rootScope which will be shared among all the components of an app.
$rootScope
var which points to the parent of all the scopes and can be injected everywhere. All other scopes are children of the $rootScope
. They are created via the $new
method of the $rootScope
thus every scope inherits from the $rootScope
.
In the angular source in the definition of the Scope
constructor there is a line :
function Scope() { this.$id = nextUid(); ... this['this'] = this.$root = this; ...
It seems the $root
var is just a placeholder for this
of the first scope created - $rootScope
.
Next there is this piece of code in the $new
method:
$new: function(isolate) { ... if (isolate) { child = new Scope(); child.$root = this.$root; ... return child;
So the $root
var of every scope child of $rootScope
is a reference to $rootScope
. And all the children of those children will get the same reference to $rootScope
In my opinion it is better to use the $rootScope
via dependency injection because it is an explicit and overall more frequently used way of referring to the $rootScope
As mentioned before, $scope.$root
holds a reference to the $rootScope
.
Unfortunately, there IS a difference between using $scope.$root
and using $rootScope
:
$scope
IS the root, its $root
property is null
$scope.$root
is only assigned on isolate scopes: https://github.com/angular/angular.js/blob/v1.3.6/src/ng/rootScope.js#L204 So you might have a situation where $scope.$root
is null
. Better use $rootScope
instead...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With