Angularjs 如何将url传递到ui路由器的$stateChangeStart

Angularjs 如何将url传递到ui路由器的$stateChangeStart,angularjs,angular-ui-router,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'

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

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'); 
            }
        });
}]);
如何将url从“阻止”状态传递到登录状态,以便在登录后继续导航到该状态

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


我基本上需要将/path/to/data发送到我的登录控制器,以便我能够处理它。在$stateChangeStart侦听器的任何状态或参数变量中,我似乎都找不到“/path/to/data”。

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

if(!AuthService.user) {
    e.preventDefault(); 
    $rootScope.pre_login_path = $location.path();
    $state.go('login'); 
}
登录后,您可以在登录控制器/服务中类似地设置登录路径(包括$rootScope和$location的依赖项注入)


$state
服务有一种方法,可以在给定状态及其参数的情况下创建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
                });
            }
        });

您需要在登录状态中添加一个
重定向
参数,以便使用该参数。

应使用服务在组件之间共享数据。为此使用
$rootScope
是一种反模式。我同意。我只是将$rootScope用作一个关联数组,它很容易注入任何角度提供程序,用于指导目的。使用$rootScope的风险对于任何全局变量都是一样的。这给了我#/for重定向URL。。。但是,@mtadd提到的$location.path()根据需要计算为/path/to/data。我想我将结合这两个答案,并将$location.path()作为参数传递给登录控制器。谢谢在
preventDefault()
之前移动
redirectUrl
声明怎么样?
$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
                });
            }
        });