如果他们没有登录,我正在尝试干净地实现一种将用户重定向到登录路由的方法。我的解决方案是基于另一个SO解答here而无法解决的问题的盒子。这是我的解决方案。
angular.module('myApp', ['ngResource', 'ngRoute'])
.config(['$routeProvider', function ($routeProvider) {
var requireAuthentication = function () {
return {
load: function ($q) {
console.log('Can user access route?');
if (g_isloggedIn === true) { // fire $routeChangeSuccess
var deferred = $q.defer();
deferred.resolve();
console.log('Yes they can!');
return deferred.promise;
} else { // fire $routeChangeError
console.log('No they cant!');
return $q.reject("'/login'");
}
}
};
};
$routeProvider
.when('/some_page_that_requires_authentication', {
templateUrl: '/views/secret.html',
controller: 'secretCtrl',
resolve: requireAuthentication()
})
.when('/anybody_can_see_me', {
templateUrl: '/views/public.html',
controller: 'publicCtrl',
});
}]);
我的问题是,我在哪里可以收听$routeChangeError
事件,以便我可以重定向路线?我尝试在指令中执行它,但永远不会触发事件。我不能把它放到控制器中,因为如果承诺被拒绝它将不会加载。有什么想法吗?
答案 0 :(得分:3)
您是否有理由不从功能内部重定向用户? 这对我来说很好,如果未解决承诺,它不会加载控制器/视图。
我修改了这个函数:
var requireAuthentication = function () {
return {
load: function ($q, $location) {
console.log('Can user access route?');
var deferred = $q.defer();
deferred.resolve();
if (g_isloggedIn === true) { // fire $routeChangeSuccess
console.log('Yes they can!');
return deferred.promise;
} else { // fire $routeChangeError
console.log('No they cant!');
$location.path('/login');
// I don't think this is still necessary:
return $q.reject("'/login'");
}
}
};
};
答案 1 :(得分:0)
您可以在此问题中找到一些帮助:AngularJS: Understanding $rootScope.$on('$routeChangeSuccess
一般来说,我觉得使用"解决"为了确保身份验证有点奇怪,但没有更好的方法,我建议添加一些服务等。除此之外。
最后,像https://github.com/dotJEM/angular-routing这样的其他路由解决方案可以为您提供更好的控制程度。
答案 2 :(得分:0)
我确定你已经很好地解决了这个问题,但对于那些现在寻找答案的人来说,这是我的两分钱。
这里唯一缺少的是当承诺被拒绝时会发生什么。您希望通过HTTP拦截执行此操作。你把一个监听器放在routeChangeError上,并在那里重定向。 https://docs.angularjs.org/api/ng/service/$http(向下滚动到拦截器部分)