我是一个角色新手。我正在尝试编写一个Angular服务,在任何页面上,将检查用户是否已登录,如果没有,则将它们转发到登录页面,将其当前路径作为GET参数传递。
我快到了,但不太合适。我遇到的问题如下:如果用户转到#/articles/my-articles/
,他们会转发到#/login/?next=%2Farticles%2F:module%2F
。
换句话说,看起来Angular正在传递路由模式,而不是实际的URL。
这是我的身份验证码:
auth.run(['$rootScope', '$location', '$user', 'TOKEN_AUTH', 'PROJECT_SETTINGS', function ($rootScope, $location, $user, TOKEN_AUTH, PROJECT_SETTINGS) {
var MODULE_SETTINGS = angular.extend({}, TOKEN_AUTH, PROJECT_SETTINGS.TOKEN_AUTH);
$rootScope.$on('$routeChangeStart', function (e, next, current) {
if (next.$$route && !next.$$route.anonymous && !$user.authenticated) {
var nextParam = next.$$route.originalPath;
$location.url(MODULE_SETTINGS.LOGIN + '?next=' + nextParam);
}
});
}]);
我可以使用current.params.module
以hacky方式获取原始路径 - 但这对我没有帮助,因为似乎routeChangeStart
被多次触发而current
对象是除了最后一次火灾之外的所有事情
这是我的路线档案:
articles.config(['$routeProvider', function ($routeProvider) {
$routeProvider
.when('/articles/:module/', {
templateUrl: 'views/articles/article_list.html',
controller: 'ArticlesListCtrl'
})
.when('/articles/:module/:id/', {
templateUrl: 'views/articles/article_detail.html',
controller: 'ArticlesDetailCtrl'
});
}]);
如何解决此问题?
答案 0 :(得分:1)
auth.run(['$rootScope', '$location', '$user', 'TOKEN_AUTH', 'PROJECT_SETTINGS', function ($rootScope, $location, $user, TOKEN_AUTH, PROJECT_SETTINGS) {
var MODULE_SETTINGS = angular.extend({}, TOKEN_AUTH, PROJECT_SETTINGS.TOKEN_AUTH);
$rootScope.$on('$routeChangeStart', function (e, next, current) {
if (!$user.authenticated) {
$location.url(MODULE_SETTINGS.LOGIN + '?next=' + $location.path());
$location.replace();
}
});
}]);
如果登录不是AngularJS视图,则可能需要提供otherwise
路径:
(取决于你的$ locationProvider配置)
$routeProvider.otherwise({
template: 'Redirecting…',
controller : 'Redirect'
});
...
articles.controller('Redirect', ['$location', function($location) {
if (someConditionThatChecksIfUrlIsPartOfApp) {
location.href = $location.path();
return;
} else {
// Show 404
}
}]);
附注:您不应该阅读$$
- 前缀属性,它们是私有的AngularJS变量。
另请注意:请勿在您自己的代码中使用$
前缀($user
),这些是为AngularJS保留的公共属性。
答案 1 :(得分:0)
我的解决方案适用于Angular 1.2.13: preventDefault停止角度路由,$ window.location将我发送到登录页面。这是在一个ASP.NET MVC + Angular应用程序。
$rootScope.$on("$locationChangeStart", function (event, next, current) {
event.preventDefault();
$window.location = '/Login';
}
});