Объект $scope служит связующим звеном между представлением в виде кода html и контроллером. Объект $scope выполняет роль модели приложения. В $scope определяются любые объекты, которые можно использовать в представлении и к которым можно устанавливать привязку данных. Формально $scope представляет обычный javascript-объект.
Каждое приложение AngularJS имеет один объект $rootScope, который является родительским по отношению ко всем остальным объектам
$scope, которые используются в контроллерах. И при запуске приложения создается привязка элемента, в котором используется директива ng-app,
к объекту $rootScope
. То есть это такой глобальный объект $scope, который мы можем использовать по всему приложению. Например:
<!doctype html> <html ng-app="myApp"> <head> <meta charset="utf-8"> </head> <body> <p>Модуль: {{ moduleName }}</p> <p>Сообщение: {{ message }}</p> <script src="js/lib/angular.min.js"></script> <script type="text/javascript"> angular.module('myApp', []) .run(function($rootScope) { $rootScope.moduleName = "myApp"; $rootScope.message = "Hello AngularJS"; }); </script> </body> </html>
Здесь у модуля используется метод run(callback), который регистрирует функцию, вызываемую при загрузке модуля. В этой функции устанавливается объект $rootScope.
Так как модуль применяется к корневому элементу страницы html (<html ng-app="myApp">
), то внутри этого элемента в любой части
будут доступны свойства и методы, определенные в $rootScope. То есть элемент html представляет контекст или область видимости, в которой мы можем использовать
свойства и методы, определенные в $rootScope.
Подобно модулю контроллеры также могут устанавливать контекст и определять использовать свой объект $scope:
<!doctype html> <html ng-app="myApp"> <head> <meta charset="utf-8"> </head> <body> <h2>{{ message }}</h2> <div ng-controller="myController"> <h3>{{ message }}</h3> </div> <h4>{{ message }}</h4> <script src="js/lib/angular.min.js"></script> <script type="text/javascript"> var myApp = angular.module('myApp', []) .run(function($rootScope) { $rootScope.message = "Модуль myApp"; }); myApp.controller('myController', function($scope) { $scope.message = "Контроллер myController"; }); </script> </body> </html>
И при создании модуля, и при создании контроллера устанавливается свойство message
, значение которого затем три раза выводится на странице.
Но для блока div устанавливается директива ng-controller, которая связывает его с контроллером myController.
Директива ng-controller создает новый объект $scope
, который является дочерним по отношению к глобальному $rootScope и который переопределяет
его действие. В то же время область действия объекта $scope, установленного в контроллере, задается только этим блоком div
, и вне
его $scope
уже не действует.