5

如果用户未登录,我正在尝试干净地实现一种将用户重定向到登录路由的方法。我的解决方案基于此处的另一个 SO 答案,该答案不能开箱即用。这是我的解决方案。

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事件以便重定向路由?我尝试在指令中执行此操作,但永远无法触发事件。我不能将它放入控制器中,因为如果承诺被拒绝,它将不会加载。有什么想法吗?

4

3 回答 3

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'");
            }
        }
    };
};
于 2014-05-05T15:35:39.173 回答
0

您可能会在这个问题中找到一些帮助:AngularJS:Understanding $rootScope.$on('$routeChangeSuccess

一般来说,我觉得使用“解决”来确保身份验证有点奇怪,但没有更好的方法,我建议添加一些服务等。这不是重点。

最后,其他路由解决方案,如https://github.com/dotJEM/angular-routing可能会为您提供更好的控制程度。

于 2013-12-13T11:56:38.460 回答
0

我相信你已经解决了这个问题,但对于那些现在正在寻找答案的人来说,这是我的两分钱。

您在这里唯一缺少的是当 Promise 被拒绝时会发生什么。您将希望通过 HTTP 拦截来执行此操作。您在 routeChangeError 上放置了一个侦听器,并在那里重定向。https://docs.angularjs.org/api/ng/service/$http(向下滚动到拦截器部分)

于 2016-05-12T17:52:28.533 回答