我试图在任何控制器加载之前从服务器端获取值。我正在使用解析器来实现这一目标。由于所有控制器都需要获取获取的值,因此我通过以下方式扩展了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”。
为什么在加载控制器之前未解析该值?
答案 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]);