现在我有一个简单的角度设置,它具有登录状态和云状态。我想这样做只有在用户通过身份验证后才能运行云状态。如果没有,它会将它们引导到登录状态。
到目前为止,我相信我已经设置了“解析”,如果解析失败,我会设置.run()
函数重定向到登录状态。
我唯一的问题是,无论如何,我的authenticated
变量得到了未定义的返回。我不确定如何合并$http.get
。
我是棱角分明的新人,所以如果有人有任何建议,我很乐意欣赏他们。
var routerApp = angular.module('app', ['ui.router'])
.factory('Auth', function($http, $state, $q) {
var factory = { isLoggedIn: isLoggedIn };
return factory;
function isLoggedIn() {
$http.get('/auth/user').then(function(data) {
return true;
});
}
})
.config(function($stateProvider, $urlRouterProvider, $locationProvider) {
$locationProvider.html5Mode(true);
$urlRouterProvider.otherwise('/cloud');
var authenticated = ['$q', 'Auth', function ($q, Auth) {
var deferred = $q.defer();
if(Auth.isLoggedIn()) deferred.resolve(); else deferred.reject();
return deferred.promise;
}];
var authGuest = function($state, Auth) {
if(Auth.isLoggedIn()) $state.transitionTo('cloud');
}
$stateProvider
.state('login', {
url: '/login',
templateUrl: "pages/templates/login.html",
onEnter: authGuest
})
.state('cloud', {
url: '/cloud',
templateUrl: "pages/templates/account.html",
resolve: { authenticated: authenticated }
})
})
.run(function ($rootScope, $state, $log) {
$rootScope.$on('$stateChangeError', function () {
$state.go('login');
});
});
答案 0 :(得分:0)
首先服务方法应该从isLoggedIn
返回promise,其他方法应该使用该promise来解决它。然后,您无需在Auth.isLoggedIn()
中使用if
,因为无论如何它将会返回catch
,then
&的承诺。其中finally
。
function isLoggedIn() {
retutn $http.get('/auth/user');
}
然后使用promise
解决这些方法var authenticated = ['$q', 'Auth', function ($q, Auth) {
var deferred = $q.defer();
Auth.isLoggedIn().then(function(){
deferred.resolve();
}, function(error){
deferred.reject();
});
return deferred.promise;
}];
var authGuest = function($state, Auth) {
Auth.isLoggedIn().then(function(){
$state.transitionTo('cloud');
})
}