ajax返回

时间:2016-01-01 19:05:53

标签: javascript angularjs ajax

如何在匿名函数返回之前延迟/推迟路由/控制器?在应用程序引导程序中,我默认rootScope.me作为来宾帐户,直到它可以检查登录用户的cookie。

我有一个控制器testCtrl,它依赖于rootScope.me数据来加载适当的用户数据。在rootScope.me有机会设置给用户之前触发控制器。

我知道Angular有$q服务来解决承诺,但我不知道如何将其应用于路由。

angular
    .module('DDE', [])
    .run(['$rootScope', 'Me', function($rootScope, Me) {

        $rootScope.me = {
            username : 'Guest',
            id : -1
        };

        if (Cookies.get('user_id') && Cookies.get('username')) {
            Me.getProfile({user_id : Cookies.get('user_id')}).success(function (res) {
                $rootScope.me = res;
            }).error(function (err) {
                console.log('Error: ', err);
            });

        }
}])
.config(['$routeProvider', '$httpProvider', '$authProvider',
           $routeProvider.
                when('/test', {
                    templateUrl: '/html/pages/test.html',
                    controller: 'testCtrl'
                }).
.config(['$routeProvider', '$httpProvider', '$authProvider', '$stateProvider', '$urlRouterProvider',
    function($routeProvider, $httpProvider, $authProvider, $stateProvider, $urlRouterProvider) {

       //Cannot inject services like Me or $rootScope as I need

        function loadProfile () {
            Me.getProfile({user_id : Cookies.get('user_id')}).success(function (res) {
                $rootScope.me = res;
            }).error(function (err) {
                console.log('Error: ', err);
            });
        }

        $stateProvider.
            state('test', {
                url : '/test',
                templateUrl: '/html/pages/test.html',
                controller : 'testCtrl',
                resolve : {
                    ProfileLoaded : function () {
                        return loadProfile();
                    }
                }
            });

1 个答案:

答案 0 :(得分:2)

编辑:添加angular的ngRoute示例。

您可以查看ui-router's resolve。在加载/导航到您的州/路线之前,它基本上等待您的承诺得到解决。

文档

  

必须解决下面解决的每个对象(通过   deferred.resolve()如果它们是一个承诺)在控制器之前   实例化。注意每个解析对象如何作为a注入   参数进入控制器。

这是angular's documentation中的angular的ngRoute示例:

.config(function($routeProvider, $locationProvider) {
  $routeProvider
   .when('/Book/:bookId', {
    templateUrl: 'book.html',
    controller: 'BookController',
    resolve: {
      // I will cause a 1 second delay
      delay: function($q, $timeout) {
        var delay = $q.defer();
        $timeout(delay.resolve, 1000);
        return delay.promise;
      }
    }
  })