在加载控制器之前解析未解决

时间:2014-12-09 11:48:40

标签: angularjs

我试图在任何控制器加载之前从服务器端获取值。我正在使用解析器来实现这一目标。由于所有控制器都需要获取获取的值,因此我通过以下方式扩展了routeConfig:

'use strict';

angular.module('myApp', [.....]).

config(['$routeProvider', function ($routeProvider) {

    var universalResolves = {

        user: function(User, $q, $rootScope) {
            var deffered = $q.defer();

            User.query({},
                function (users) {
                    deffered.resolve(
                        $rootScope.activeUser = users[0]
                    )
                }, function(){
                    deffered.reject();
                }
            );

            return deffered.$promise;
        }


    };

    var customRouteProvider = angular.extend({}, $routeProvider, {
        when: function(path, route) {
            route.resolve = (route.resolve) ? route.resolve : {};
            angular.extend(route.resolve, universalResolves);
            $routeProvider.when(path, route);
            return this;
        }
    });

    customRouteProvider.when('/users', {
        templateUrl: 'partials/users.html',
        controller: 'UserController'
    });

    customRouteProvider.otherwise({redirectTo: '/home'});
}]);

但是当我尝试从控制器打印activeUser时,我得到'未定义'。

.controller('UserController', ['$scope', function ($scope) {

        console.log($scope.activeUser.id);
        .....

 };

这里我收到以下错误: TypeError:无法读取未定义的属性“id”。

为什么在加载控制器之前未解析该值?

1 个答案:

答案 0 :(得分:0)

延迟对象没有此类属性$promise,它是promise

user: function(User, $q, $rootScope) {
    var deffered = $q.defer();

    User.query({}, function(users) {
        deffered.resolve($rootScope.activeUser = users[0]);
    }, function() {
        deffered.reject();
    });

    return deffered.promise;
    //             ^ don't put $ here
}

最好将已解决的user注入控制器,然后使用$ rootScope:

.controller('UserController', ['$scope', 'user', function ($scope, activeUser) {
    console.log(activeUser.id);
};

最后只是为了更好的编码风格,这个作业

$rootScope.activeUser = users[0]

有点令人困惑。它更具可读性:

$rootScope.activeUser = users[0];
deffered.resolve(users[0]);