Прикрепление глобальных функций и данных к $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/...

Я попытался собрать все возможные методы разрешения зависимостей в глобальной области до того, как будут выполнены фактические контроллеры.