当路线改变时,我尝试访问/设置
.when('/settings', {
templateUrl: 'partials/settings',
controller: 'SettingsCtrl',
authenticate: true
})
.run(function ($rootScope, $location, Auth) {
$rootScope.$on('$routeChangeStart', function (event, next) {
Auth.checkUser();
if (next.authenticate && !Auth.isLoggedIn()) {
$location.path('/login');
}
});
代码调用Auth.checkUser()(Asynch),然后调用!Auth.isLoggedIn()。问题是我需要等待Auth.checkUser(),这会给我正确的用户状态,或者在提供模板之前找到检查响应的方法。
checkUser: function(user, callback) {
var cb = callback || angular.noop;
return User.check(user,
function(user) {
$rootScope.currentUser = user.id;
return cb(user);
},
function(err) {
return cb(err);
}).$promise;
},
isLoggedIn: function() {
var user = $rootScope.currentUser;
return !!user;
}
答案 0 :(得分:0)
您应该使用angularjs控制器的resolve
机制。这样,您可以在渲染之前定义控制器的任何先决条件(服务注入,等待承诺等)。
示例:
.when('/settings', {
templateUrl: 'partials/settings',
controller: 'SettingsCtrl',
authenticate: true,
resolve: {
isUserLogged: ['yourservice' , function(yourservice) {
return yourservice.isUserLoggedPromise();
}]
}
})
只有在isUserLoggedPromise
解析之后才会呈现您的屏幕