使用解析和 http.get 请求对用户进行角度验证
Angularness authenticating user with resolve and http.get request
现在我有一个简单的 angular 设置,其中包含登录状态和云状态。我想做到这一点,如果用户通过身份验证,云状态只能是 运行。如果没有,它将引导他们进入登录状态。
到目前为止,我相信我已经设置了 "resolve" 并且我设置了 .run()
函数以在解析失败时重定向到登录状态。
我唯一的问题是,无论如何,我的 authenticated
变量 get 返回时未定义。我不确定如何合并 $http.get
.
我是 angular 的新手,所以如果有人有任何建议,我将不胜感激。
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');
});
});
首先服务方法应该 return 来自 isLoggedIn
的承诺,其他方法应该使用该承诺来解决它。那么你不需要在 if
中使用 use Auth.isLoggedIn()
因为无论如何它都会 return 一个 catch
, then
& [=17 的承诺=] 在里面。
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');
})
}
现在我有一个简单的 angular 设置,其中包含登录状态和云状态。我想做到这一点,如果用户通过身份验证,云状态只能是 运行。如果没有,它将引导他们进入登录状态。
到目前为止,我相信我已经设置了 "resolve" 并且我设置了 .run()
函数以在解析失败时重定向到登录状态。
我唯一的问题是,无论如何,我的 authenticated
变量 get 返回时未定义。我不确定如何合并 $http.get
.
我是 angular 的新手,所以如果有人有任何建议,我将不胜感激。
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');
});
});
首先服务方法应该 return 来自 isLoggedIn
的承诺,其他方法应该使用该承诺来解决它。那么你不需要在 if
中使用 use Auth.isLoggedIn()
因为无论如何它都会 return 一个 catch
, then
& [=17 的承诺=] 在里面。
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');
})
}