Конечно, многие из вас вспомнят про метод run() внутри каждого модуля. Однако я отвечу вам, что этот метод срабатывает ДО инициализации приложения. Точнее после загрузки инжектором всех модулей, но до их выполнения. Это легко проверить.
angular.module("use", []) .config([function(){ console.log("::use::config"); }]) .run([function(){ console.log("::use::run"); }]) .controller("BarCtrl", ["$scope", function($scope){ console.log("::use::ctrl::BarCtrl"); $scope.foo = "bar"; }]) ;
Приведённый выше код выведет в консоль:
::use::config ::use::run ::use::ctrl::BarCtrl
И всё же есть способ оповестить приложение об инициализации. В этом нам поможет метод angular.bootstrap. Этот метод позволяет прикреплять модуль к DOM элементу без использования директивы ng-app. После того, как мы прикрепим модуль и в нём отработают все элементы, мы можем получить ссылку на $rootScope модуля из инжектора и оповестить все дочерние элементы. В AngularJS есть 2 метода работы с событиями — $emit и $broadcast. Отличие первого от второго в том, что он работает “вверх” и его может остановить любой родительский обработчик. В общем, прямой аналог событий DOM. Второй же оповещает “вниз” и его невозможно остановить. Оба метода начинают работу с текущей области видимости.
Итак, попробуем подвести итог всех рассуждений и показать уже этот кусок кода.
angular.element(document).ready(function(){ var $inj = angular.bootstrap(document.body, ['use']); var $rootScope = $inj.get("$rootScope"); $rootScope.$broadcast("init", "hello"); $rootScope.$digest(); });
Поскольку мы находимся вне контекста AngularJS, необходимо самим запустить внутренний $digest() цикл. Как видно из консоли из примера по ссылке выше, событие запускается именно после работы всех компонентов модуля. Что, собственно, и требовалось.
ссылка на оригинал статьи http://habrahabr.ru/post/232219/
Добавить комментарий