在AngularJS中初始化时将全局函数和数据附加到$ rootScope

时间:2013-04-01 22:39:01

标签: javascript angularjs

我希望在第一次启动AngularJS应用程序时或每次刷新页面时都有一个“全局函数”。

此函数将使用$http.get()调用我的服务器以获取使用我的应用程序所需的全局信息。我需要在此功能中访问$rootScope。之后,只有在此请求完成后,我才使用app.config$routeProvider.when()加载好控制器。

app.config(['$routeProvider', function($routeProvider) {
    $routeProvider
        .when('/', 
        {
            /**/
        });
}]);

我不希望应用程序在此操作完成之前执行某些操作。所以我想我必须使用“解决方案”,但我真的不知道如何使用它。

有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:23)

这不是解决您问题的最佳方法,但这是针对您提问的解决方案。

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

答案 1 :(得分:3)

作为解决方案的第一步,我认为您可以监控在每次路由更改之前触发的$ 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');
        }
    });
});

您应该查看this article有关单页应用程序中的身份验证的信息。我想你可以做类似的工作。

答案 2 :(得分:0)

请考虑这个答案: https://stackoverflow.com/a/27050497/1056679

我试图在执行实际控制器之前收集解决全局范围内依赖关系的所有可能方法。