angularjs中的常用路线解析器?

时间:2015-05-23 07:47:28

标签: javascript angularjs angular-routing normalize

我在angularjs中使用路由解析器,如果用户未按如下方式登录,则用户将重定向到登录,

 $routeProvider
        .when('/', {
            templateUrl: 'app/components/main/dashboard.html',
            controller: 'dashboardController',
            resolve: {
                login: function ($rootScope, $location) {
                    if (!$rootScope.currentUser) {
                        $location.path('/login');
                    }
                }
            }
        })

这里我想在许多其他路线中使用此登录功能,所以我可以将相同的解析功能复制到每个地方,如下所示,

.when('/items', {
            templateUrl: 'app/components/item/list.html',
            controller: 'itemController',
            resolve: {
                login: function ($rootScope, $location) {
                    if (!$rootScope.currentUser) {
                        $location.path('/login');
                    }
                }
            }
        })

它工作正常,我的问题是,有没有办法避免这种代码重复,还是有其他更好的方法?

1 个答案:

答案 0 :(得分:3)

我昨天设置了一个github存储库,它是一个Web应用程序的起点,并包含此功能here

如果您查看public/app/app-routes.js,您会看到我已将解析函数添加为变量,那么您可以简单地执行此操作,而不是每次都编写整个函数:

功能

var checkLoggedIn = function($q, $timeout, $http, $window, $location, $rootScope) {
        // Initialize a new promise
        var deferred = $q.defer();

        // Make an AJAX call to check if the user is logged in
        $http.get('/loggedin').success(function(user) {

            // Authenticated
            if (user !== '0') {
                $rootScope.loggedInUser = user;
                $window.sessionStorage['loggedInUser'] = JSON.stringify(user);
                deferred.resolve();
            }

            // Not Authenticated
            else {
                $window.sessionStorage['loggedInUser'] = null;
                $rootScope.loggedInUser = null;
                deferred.reject();
                $location.url('/login');
            }
        });

        return deferred.promise;
    };
    checkLoggedIn.$inject = ["$q", "$timeout", "$http", "$window", "$location", "$rootScope"];

路线

.when('/profile', {
            title: 'Profile',
            templateUrl: '/app/templates/profile.html',
            controller: 'ProfileController',
            resolve: {
                loggedIn: checkLoggedIn
            }
        })

应该可以轻松适应您的应用。希望有所帮助!