16

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

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

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

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

任何的想法?

谢谢!

4

3 回答 3

24

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

里面的任何东西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

于 2013-04-01T23:03:41.747 回答
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');
        }
    });
});

你应该看看这篇关于单页应用程序中的身份验证的文章。我想你可以做类似的事情。

于 2013-04-04T04:41:00.390 回答
0

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

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

于 2014-11-25T15:14:31.420 回答