- PVSM.RU - https://www.pvsm.ru -
Если вы уже знаете, что такое AngularJS [1] и пользуетесь им продолжительное время, вероятно перед вами уже стояла задача выполнения неких действий сразу после инициализации приложения. И после прочтения документации вы обнаруживаете, что такого способа “из коробки” нет)
Конечно, многие из вас вспомнят про метод run() [2] внутри каждого модуля. Однако я отвечу вам, что этот метод срабатывает ДО инициализации приложения. Точнее после загрузки инжектором всех модулей, но до их выполнения. Это легко проверить.
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
Живой пример. [3]
И всё же есть способ оповестить приложение об инициализации. В этом нам поможет метод angular.bootstrap [4]. Этот метод позволяет прикреплять модуль к DOM элементу без использования директивы ng-app [5]. После того, как мы прикрепим модуль и в нём отработают все элементы, мы можем получить ссылку на $rootScope [6] модуля из инжектора [7] и оповестить все дочерние элементы. В AngularJS есть 2 метода работы с событиями — $emit [8] и $broadcast [9]. Отличие первого от второго в том, что он работает “вверх” и его может остановить любой родительский обработчик. В общем, прямой аналог событий DOM. Второй же оповещает “вниз” и его невозможно остановить. Оба метода начинают работу с текущей области видимости.
Итак, попробуем подвести итог всех рассуждений и показать уже этот кусок кода.
angular.element(document).ready(function(){
var $inj = angular.bootstrap(document.body, ['use']);
var $rootScope = $inj.get("$rootScope");
$rootScope.$broadcast("init", "hello");
$rootScope.$digest();
});
Живой пример [10]
Поскольку мы находимся вне контекста AngularJS, необходимо самим запустить внутренний $digest() цикл. Как видно из консоли из примера по ссылке выше, событие запускается именно после работы всех компонентов модуля. Что, собственно, и требовалось.
Автор: ReklatsMasters
Источник [11]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/66863
Ссылки в тексте:
[1] AngularJS : https://angularjs.org
[2] run(): https://docs.angularjs.org/api/ng/type/angular.Module#run
[3] Живой пример.: http://codepen.io/ReklatsMasters/pen/zJnBu
[4] angular.bootstrap: https://code.angularjs.org/1.2.21/docs/api/ng/function/angular.bootstrap
[5] ng-app: https://code.angularjs.org/1.2.21/docs/api/ng/directive/ngApp
[6] $rootScope: https://code.angularjs.org/1.2.21/docs/api/ng/service/$rootScope
[7] инжектора: https://code.angularjs.org/1.2.21/docs/api/auto/service/$injector
[8] $emit: https://code.angularjs.org/1.2.21/docs/api/ng/type/$rootScope.Scope#$emit
[9] $broadcast: https://code.angularjs.org/1.2.21/docs/api/ng/type/$rootScope.Scope#$broadcast
[10] Живой пример: http://codepen.io/ReklatsMasters/pen/vyjFs?editors=101
[11] Источник: http://habrahabr.ru/post/232219/
Нажмите здесь для печати.