我有一个应用程序使用会话来维护状态和身份验证。除了一件事以外,一切正常。 $ state.go转换并不总是在用户注销并且会话被销毁时触发。它大部分时间转换回登录页面,但并非全部时间。我使用抽象状态来解析用户是登录还是注销,并分别将用户限制到仪表板或登录页面。是否有一定的顺序,我必须做的事情或任何人可能会看到可能导致此行为的任何事情?
我的$状态配置:
app.config(function ($stateProvider, $urlRouterProvider,$locationProvider) {
$urlRouterProvider.otherwise("/dashboard");
$locationProvider.html5Mode(true);
$stateProvider.state('no_session',{
abstract:true,
template: "<ui-view/>",
resolve: {
authenticated:function($rootScope,$q, Session){
var deferred = $q.defer();
var session = Session.getSession();
if (session) {
$rootScope.authenticated = true;
}
if (!$rootScope.authenticated){
deferred.resolve({authenticated:false});
} else {
deffered.reject({authenticated:true});
}
}
}
});
$stateProvider.state('no_session.login', {
url: '/',
templateUrl: 'app/views/auth/login.html',
controller:'AuthCtrl'
});
$stateProvider.state('session', {
abstract: true,
template: "<ui-view/>",
resolve: {
authenticated:function($rootScope,$q,Session){
var deferred = $q.defer();
var session = Session.getSession();
if (session) {
$rootScope.authenticated = true;
}
if ($rootScope.authenticated===true){
deferred.resolve({authenticated:true});
} else {
deffered.reject({authenticated:false});
}
}
}
});
$stateProvider.state('session.dashboard', {
url:'/dashboard',
templateUrl:'app/views/auth/dashboard.html'
});
});
app.run (function($rootScope, $state){
$rootScope.$on("$stateChangeStart", function (event, current, previous, eventObj) {
});
$rootScope.$on("$stateChangeError", function (event, current, previous, eventObj) {
if (!$rootScope.authenticated) {
$state.go('no_session.login');
} else {
$state.go('session.dashboard');
}
});
});
我验证控制器(Data.get( '注销')返回 '成功',以及登录请求):
app.controller('AuthCtrl', ['$window','$state','$scope','$rootScope', 'Data', function ($window,$state,$scope, $rootScope, Data) {
$scope.login = function() {
var user = $scope.user;
Data.post('login', {
user:user
}).then(function(results){
if (results.data.status == 'success') {
Data.toast(results.data);
$rootScope.authenticated=true;
$rootScope.name=results.data.name;
$rootScope.user_id=results.data.user_id;
$window.sessionStorage["session"] = JSON.stringify({authenticated:true});
$state.go('session.dashboard');
} else {
Data.toast(results.data);
$scope.user = angular.copy($scope.master); }
})
};
$scope.logout = function() {
Data.get('logout').then(function(results){
$state.go('no_session.login');
Data.toast(results);
$rootScope.authenticated=null;
$rootScope.name=null;
$rootScope.user_id=null;
$window.sessionStorage["session"] = null;
});
}
}]);
我的会话工厂(用于做更多,但我把大部分代码移到控制器上):
app.factory('Session', ['Data','$rootScope','$q','$window', function(Data, $rootScope,$q,$window){
var session;
function init() {
if ($window.sessionStorage["session"]) {
session = JSON.parse($window.sessionStorage["session"]);
}
}
init();
function getSession(){
return session;
}
return {
getSession: getSession
}
}]);
实际上现在看它,这个工厂p可以自由地再也没有做任何事情,并且可能是问题所在。它只是从$ state中调用来解析,而且可能有一种方法可以在没有factory的情况下执行。我可能应该将所有$ rootScope的东西移到工厂中,以清除$ rootScope中的内容,如果我在此处了解到任何内容回复了对工厂解决方案的承诺,但它是一个如此小的应用程序,而且这个会话信息是我在那里存储的唯一的东西。我不知道。有什么建议么?提前致谢。
TL; DR;在你的决心,不应该'返回deferred.promise;'? –
是...感谢您的帮助,我想出了下面的解决方案 – OGZCoder