我目前在我的app.js
配置中有以下代码,用于安全路由:
var checkLoggedin = function($q, $timeout, $http, $location, $rootScope){
// Initialize a new promise
var deferred = $q.defer();
// Make an AJAX call to check if the user is logged in
$http.get('/api/loggedin').success(function(user){
// Authenticated
if (user !== '0')
$rootScope.user = user; //IS THIS ADVISABLE???
$timeout(deferred.resolve, 0);
// Not Authenticated
else {
$timeout(function(){deferred.reject();}, 0);
$location.url('/login');
}
});
return deferred.promise;
};
后端返回用户对象。
我希望能够从不同的控制器访问当前用户,并想知道我是否应该使用$rootscope
(如上所示)或是否Service
是可行的方法。
如果服务是前进的方式,那么任何代码示例都将非常受欢迎。
答案 0 :(得分:0)
如果您只想在视图中使用您的用户变量,那么从rootScope读取就可以了。但是,如果您在控制器中想要将该用户用于某些内容,则无法直接从rootScope中读取该内容,因为该checkLoggedin
函数可能尚未设置该变量。
例如,如果您在控制器中有这样的代码
.controller('NavbarCtrl', function ($scope, $rootScope) {
if ($rootScope.user) {
// do logged in stuff
}
//...
可能会失败,因为promise还没有在rootscope中设置用户变量。
这有点烦人,但为了保证变量总是被设置,需要将它作为一个承诺。所以我会尝试通过服务始终访问登录用户。
.service('PersonService', function ($http) {
return {
getCurrentUser: function() {
return $http.get('/api/person/me', {cache: true});
// or you can use something similar to your code above
}
}
});
是一个例子。如您所见,我已启用缓存,因此多次调用该函数不会创建对后端的新调用。
然后像这样使用它:
.controller('NavbarCtrl', function ($scope, PersonService) {
PersonService.getCurrentUser().success(function(user) {
$scope.user = user;
// or maybe do something else
$scope.showButton = user.permissionLevel > 5;
});
// .....