Angularjs Error: null is not an object (evaluating 'a.$current.locals[l]')
Angularjs Error: null is not an object (evaluating 'a.$current.locals[l]')
我有一个 angular 项目设置,当用户转到 /cloud
并且他们没有登录(isLoggedIn()
return 失败)时,它会重定向至 /login
。然后,如果他们登录并转到 /login
,它会将他们重定向回 /cloud
。
但是,当我点击注销按钮清除本地存储时,出现以下错误(一切仍然有效):
Error: null is not an object (evaluating 'a.$current.locals[l]')
根据我的日志,它似乎发生在我的注销控制器的 onEnter
上。
我是 angular 的新手,如有任何建议或指导,我们将不胜感激。
var routerApp = angular.module('myapp', ['ui.router'])
//config for state changes
.factory('Auth', function($http, $state, $q) {
var factory = { isLoggedIn: isLoggedIn };
return factory;
function isLoggedIn(token) {
return $http.post('/auth/session', {token:token});
}
})
.config(function($stateProvider, $urlRouterProvider, $locationProvider) {
$locationProvider.html5Mode(true);
$urlRouterProvider.otherwise('/cloud');
var authenticated = ['$q', 'Auth', '$rootScope', function ($q, Auth, $rootScope) {
var deferred = $q.defer();
if (typeof window.localStorage['authtoken'] === 'undefined') {
var authtoken = undefined;
} else {
var authtoken = window.localStorage['authtoken'];
}
Auth.isLoggedIn(authtoken).then(function() {
deferred.resolve();
}, function() {
deferred.reject();
});
return deferred.promise;
}];
var authGuest = ['$q', 'Auth', '$rootScope', function ($q, Auth, $rootScope) {
var deferred = $q.defer();
if (typeof window.localStorage['authtoken'] === 'undefined') {
var authtoken = undefined;
} else {
var authtoken = window.localStorage['authtoken'];
}
Auth.isLoggedIn(authtoken).then(function() {
deferred.reject();
}, function() {
deferred.resolve();
});
return deferred.promise;
}];
$stateProvider
.state('login', {
url: '/login',
templateUrl: 'pages/templates/login.html',
resolve: { authenticated: authGuest }
})
.state('logout', { url: '/logout', onEnter: function($state) { localStorage.clear(); $state.go('login'); } })
.state('cloud', {
url: '/cloud',
templateUrl: 'pages/templates/cloud.html',
resolve: { authenticated: authenticated }
})
})
.run(function ($rootScope, $state) {
$rootScope.$on('$stateChangeError', function (event, from, error) {
if(from.name == "login") {
$state.go('cloud');
} else {
$state.go('login');
}
});
});
问题好像出在这里:
var authenticated = ['$q', 'Auth', '$rootScope', function ($q, Auth, $rootScope) {
var deferred = $q.defer();
if (typeof window.localStorage['authtoken'] === 'undefined') {
var authtoken = undefined;
} else {
var authtoken = window.localStorage['authtoken'];
}
Auth.isLoggedIn(authtoken).then(function() {
deferred.resolve();
}, function() {
deferred.reject();
});
return deferred.promise;
}];
这个函数只会在Configuration
上运行一次。无论LocalStorage
如何,承诺一旦解决,将继续解决为相同的价值。每次你
resolve: { authenticated: authenticated }
您将在 Configuration
步取回 authenticated
值。
相反,添加一个控制器来定义函数以请求每种类型的状态
.controller('AuthenticationController', function($scope, '$q', Auth, '$rootScope') {
$scope.authenticated = function () {
var deferred = $q.defer();
if (typeof window.localStorage['authtoken'] === 'undefined') {
var authtoken = undefined;
} else {
var authtoken = window.localStorage['authtoken'];
}
Auth.isLoggedIn(authtoken).then(function() {
deferred.resolve();
}, function() {
deferred.reject();
});
return deferred.promise;
};
$scope.authGuest = function ($scope, '$q', Auth, '$rootScope') {
....
return deferred.promise;
};
});
然后,在你的路由配置中:
.state('login', {
url: '/login',
templateUrl: 'pages/templates/login.html',
controller: 'AuthenticationController'
resolve: { authenticated: $scope.authGuest() }
})
.state('cloud', {
url: '/cloud',
templateUrl: 'pages/templates/cloud.html',
resolve: { authenticated: $scope.authenticated()}
})
现在,每次你都在解决一个新的承诺。
免责声明: 由于没有可用的工作版本,我编写了此代码用于演示目的。应该将其视为伪代码以引导正确的方向。
我有一个 angular 项目设置,当用户转到 /cloud
并且他们没有登录(isLoggedIn()
return 失败)时,它会重定向至 /login
。然后,如果他们登录并转到 /login
,它会将他们重定向回 /cloud
。
但是,当我点击注销按钮清除本地存储时,出现以下错误(一切仍然有效):
Error: null is not an object (evaluating 'a.$current.locals[l]')
根据我的日志,它似乎发生在我的注销控制器的 onEnter
上。
我是 angular 的新手,如有任何建议或指导,我们将不胜感激。
var routerApp = angular.module('myapp', ['ui.router'])
//config for state changes
.factory('Auth', function($http, $state, $q) {
var factory = { isLoggedIn: isLoggedIn };
return factory;
function isLoggedIn(token) {
return $http.post('/auth/session', {token:token});
}
})
.config(function($stateProvider, $urlRouterProvider, $locationProvider) {
$locationProvider.html5Mode(true);
$urlRouterProvider.otherwise('/cloud');
var authenticated = ['$q', 'Auth', '$rootScope', function ($q, Auth, $rootScope) {
var deferred = $q.defer();
if (typeof window.localStorage['authtoken'] === 'undefined') {
var authtoken = undefined;
} else {
var authtoken = window.localStorage['authtoken'];
}
Auth.isLoggedIn(authtoken).then(function() {
deferred.resolve();
}, function() {
deferred.reject();
});
return deferred.promise;
}];
var authGuest = ['$q', 'Auth', '$rootScope', function ($q, Auth, $rootScope) {
var deferred = $q.defer();
if (typeof window.localStorage['authtoken'] === 'undefined') {
var authtoken = undefined;
} else {
var authtoken = window.localStorage['authtoken'];
}
Auth.isLoggedIn(authtoken).then(function() {
deferred.reject();
}, function() {
deferred.resolve();
});
return deferred.promise;
}];
$stateProvider
.state('login', {
url: '/login',
templateUrl: 'pages/templates/login.html',
resolve: { authenticated: authGuest }
})
.state('logout', { url: '/logout', onEnter: function($state) { localStorage.clear(); $state.go('login'); } })
.state('cloud', {
url: '/cloud',
templateUrl: 'pages/templates/cloud.html',
resolve: { authenticated: authenticated }
})
})
.run(function ($rootScope, $state) {
$rootScope.$on('$stateChangeError', function (event, from, error) {
if(from.name == "login") {
$state.go('cloud');
} else {
$state.go('login');
}
});
});
问题好像出在这里:
var authenticated = ['$q', 'Auth', '$rootScope', function ($q, Auth, $rootScope) {
var deferred = $q.defer();
if (typeof window.localStorage['authtoken'] === 'undefined') {
var authtoken = undefined;
} else {
var authtoken = window.localStorage['authtoken'];
}
Auth.isLoggedIn(authtoken).then(function() {
deferred.resolve();
}, function() {
deferred.reject();
});
return deferred.promise;
}];
这个函数只会在Configuration
上运行一次。无论LocalStorage
如何,承诺一旦解决,将继续解决为相同的价值。每次你
resolve: { authenticated: authenticated }
您将在 Configuration
步取回 authenticated
值。
相反,添加一个控制器来定义函数以请求每种类型的状态
.controller('AuthenticationController', function($scope, '$q', Auth, '$rootScope') {
$scope.authenticated = function () {
var deferred = $q.defer();
if (typeof window.localStorage['authtoken'] === 'undefined') {
var authtoken = undefined;
} else {
var authtoken = window.localStorage['authtoken'];
}
Auth.isLoggedIn(authtoken).then(function() {
deferred.resolve();
}, function() {
deferred.reject();
});
return deferred.promise;
};
$scope.authGuest = function ($scope, '$q', Auth, '$rootScope') {
....
return deferred.promise;
};
});
然后,在你的路由配置中:
.state('login', {
url: '/login',
templateUrl: 'pages/templates/login.html',
controller: 'AuthenticationController'
resolve: { authenticated: $scope.authGuest() }
})
.state('cloud', {
url: '/cloud',
templateUrl: 'pages/templates/cloud.html',
resolve: { authenticated: $scope.authenticated()}
})
现在,每次你都在解决一个新的承诺。
免责声明: 由于没有可用的工作版本,我编写了此代码用于演示目的。应该将其视为伪代码以引导正确的方向。