Прикрепление глобальных функций и данных к $rootScope при инициализации в AngularJS
Я хотел бы иметь "глобальную функцию", называемую в первый раз, когда я запускаю приложение AngularJS, или каждый раз, когда я обновляю страницу.
Эта функция вызовет мой сервер с помощью $http.get()
, чтобы получить глобальную информацию, необходимую для использования моего приложения. Мне нужно получить доступ к $rootScope
в этой функции. После этого и только после того, как этот запрос закончен, я использую app.config
и $routeProvider.when()
для загрузки хорошего контроллера.
app.config(['$routeProvider', function($routeProvider) {
$routeProvider
.when('/',
{
/**/
});
}]);
Я не хочу, чтобы приложение делало что-то до того, как это действие закончено. Поэтому я предполагаю, что мне нужно использовать "решение", но я действительно не знаю, как его использовать.
Любая идея?
Спасибо!
Ответы
Ответ 1
Это не лучший способ решить вашу проблему, но вот предлагаемое решение для вашего вопроса.
Все, что внутри run(...)
будет запущено при инициализации.
angular.module('fooApp').run(['$http', '$rootScope' function($http, $rootScope) {
$http.get(...).success(function(response) {
$rootScope.somedata = response;
});
$rootScope.globalFn = function() {
alert('This function is available in all scopes, and views');
}
}]);
Теперь предупреждение может быть запущено во всех ваших представлениях, используя ng-click="globalFn()"
.
Имейте в виду, что директивы, использующие новую область выделения, не будут иметь доступа к этим данным, если они явно не наследуются: $scope.inheritedGlobalFn = $rootScope.globalFn
Ответ 2
В качестве первого шага для вашего решения я считаю, что вы можете отслеживать событие $routeChangeStart, которое запускается до каждого изменения маршрута (или обновления страницы в вашем случае).
var app = angular.module('myApp').run(['$rootScope', function($rootScope) {
$rootScope.$on("$routeChangeStart", function (event, next, current) {
if (!$rootScope.myBooleanProperty)) {
$location.path('/');
}
else {
$location.path('/page');
}
});
});
Вы должны взглянуть на эту статью об аутентификации в приложении с одной страницей. Я думаю, вы могли бы сработать нечто подобное.
Ответ 3
Пожалуйста, рассмотрите этот ответ:
fooobar.com/info/16089/...
Я попытался собрать все возможные методы разрешения зависимостей в глобальной области до того, как будут выполнены фактические контроллеры.