如何将url传递给ui-router的$ stateChangeStart

时间:2015-09-15 19:06:27

标签: angularjs angular-ui-router

如果用户未登录,我将使用以下内容将路由重定向到登录:

angular.module('app').run(['$rootScope', '$location', '$state', 'AuthService', 
    function($rootScope, $location, $state, AuthService) {

    /* redirect to login if not logged in */
    $rootScope.$on( '$stateChangeStart', 
        function(e, toState, toParams, fromState, fromParams) {
            if(toState.name === "login"){
               return; // already going to login 
            }

            if(!AuthService.user) {
                e.preventDefault(); 
                $state.go('login'); 
            }
        });
}]);

如何将网址从“已阻止”状态传递到登录状态,以便我可以在登录后继续导航到该状态?

示例:用户点击myapp.com/#/path/to/data的链接 - >重定向到myapp.com/#/login - >用户登录 - >用户路由到myapp.com /#/ path / to / data

我基本上需要将/ path / to / data发送到我的登录控制器,以便我可以处理它。我似乎无法在$ stateChangeStart监听器中的任何状态或参数变量中找到'/ path / to / data'。

2 个答案:

答案 0 :(得分:3)

$state服务有href方法,可以根据状态及其参数创建URL。由于这些是提供给状态更改侦听器的,因此您可以创建一个URL,然后将其作为参数传递给登录状态。

$rootScope.$on('$stateChangeStart',
        function(e, toState, toParams, fromState, fromParams) {
            if (toState.name === "login") {
                return; // already going to login
            }

            if (!AuthService.user) {
                e.preventDefault();

                var redirectUrl = $state.href(toState.name, toParams);

                $state.go('login', {
                    redirect: redirectUrl
                });
            }
        });

您需要在登录状态中添加redirect参数,以便使用该参数。

答案 1 :(得分:-2)

您可以将登录前位置存储在$ rootScope中,然后在登录成功后从那里获取

if(!AuthService.user) {
    e.preventDefault(); 
    $rootScope.pre_login_path = $location.path();
    $state.go('login'); 
}

然后在登录后,您可以在登录控制器/服务中类似地设置登录路径(包括$ rootScope和$ location的依赖注入)

$location.path($rootScope.pre_login_path);