我正在用AngularJS构建一个应用程序。我有身份验证工作,当用户未被授权时,他被重定向到显示登录表单的#/login
。
但是,当用户通过身份验证并手动转到#/login
时,再次显示登录页面,尽管用户仍在登录。在这种情况下,有什么办法把他引导到主页吗?
我是这样做的:
$routeProvider
.when( '/ds', {
templateUrl: 'partials/datasheets-list.html',
controller: 'DatasheetsListCtrl'
} )
.when( '/ds/:datasheetId', {
templateUrl: 'partials/datasheet-detail.html',
controller: 'DatasheetDetailCtrl'
} )
.when( '/login', {
templateUrl: 'partials/login.html',
controller: 'LoginController'
} )
.otherwise( {
redirectTo: '/ds'
} );
LoginController
的代码:
var datasheetsControllers = angular.module( 'datasheetsControllers', ['ngCookies', 'datasheetsServices'] );
datasheetsControllers.controller( 'LoginController', ['$scope', '$rootScope', '$location', '$http', '$cookieStore', 'LoginService', function ( $scope, $rootScope, $location, $http, $cookieStore, LoginService )
{
$scope.login = function ()
{
LoginService.authenticate( $.param( {username: $scope.username, password: $scope.password} ), function ( user )
{
$rootScope.user = user;
// Authenticate AngularJS Ajax calls
$http.defaults.headers.common[ xAuthTokenHeaderName ] = user.token;
// Authenticate jQuery Ajax calls
var headers = {};
headers[xAuthTokenHeaderName] = user.token;
$.ajaxSetup({
headers: headers
});
$cookieStore.put( 'user', user );
$location.path( "/" );
} );
};
}] );
我认为通常的做法是听$routeChangeStart
事件。
$scope.$on('$routeChangeStart', function(scope, next, current){
//...
});
这里你可以询问下一个路径是否为login,然后你可以检查用户是否已经登录了。如果是,像往常一样使用重定向将他直接重定向到登录
或者你可以在你的路由对象
中使用resolve
回调when('/login', { controller: 'LoginCtrl', templateUrl: '', resolve : {
load : function ( ... ) { ... }
})
上面已经有类似的东西了
AngularJS -需要$routeChangeStart和$locationChangeStart的组合
在AngularJS中,当路由被改变(动画、加载器等)时触发一个回调
我设法通过简单地将此添加到LoginController
:
if( $rootScope.user )
{
$location.path( "/" );
}
($scope.login = function ()
行前)
这似乎工作得很好,但我不知道这样做是否被认为是一种不好的做法?