【问题标题】:Common route resolver in angularjs?angularjs中的通用路由解析器?
【发布时间】:2015-08-05 06:40:51
【问题描述】:

我在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');
                    }
                }
            }
        })

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

【问题讨论】:

    标签: javascript angularjs angular-routing normalize


    【解决方案1】:

    我昨天建立了一个 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
                }
            })
    

    应该很容易适应您的应用。希望对您有所帮助!

    【讨论】:

    • 谢谢你的回答,我会检查并很快回来:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 2013-07-04
    • 2015-02-02
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    相关资源
    最近更新 更多