我正在尝试干净地实现一种方法,如果他们没有登录,将用户重定向到登录路由.我的解决方案是基于另一个不能开箱即用的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事件,以便我可以重定向路由?我尝试在指令中执行它,但永远不会触发事件.我无法将其放入控制器,因为如果承诺被拒绝,它将无法加载.有什么想法吗?
您是否有理由不从函数内部重定向用户?
这对我来说很好,如果未解决承诺,它不会加载控制器/视图.
这对我来说很好,如果未解决承诺,它不会加载控制器/视图.
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'"); } } }; };