使用UI-router登录后重定向到原始状态

5
使用UI-router时,当用户访问需要登录的页面后,在他们登录后,我希望将他们重定向回原来的URL地址。例如:
/account/profile --> LOGIN PAGE (/login) --> /account/profile
/someother/requiredLogin/path --> LOGIN PAGE (/login) --> /someother/requiredLogin/path

我的路由:

  $stateProvider
    .state('accountProfile', {
      url: '/account/profile',
      data: {
        requiresLogin: true
      },
      views: {
        '': {
          templateProvider: function($templateCache) {
            return $templateCache.get('templates/profile.html');
          }
        }
      },
    })
    .state('anotherPage', {
      url: '/someother/path',
      data: {
        requiresLogin: true
      },
      views: {
        '': {
          templateProvider: function($templateCache) {
            return $templateCache.get('templates/other.html');
          }
        }
      },
    })

在我的应用程序的运行块(run block)中,我有以下代码:

.run(['$rootScope', '$state', 'LoginService',
    function($rootScope, $state, LoginService) {

      // Change title based on the `data` object in routes
      $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
        var requiresLogin = toState.data.requiresLogin;

        if (requiresLogin && !LoginService.check()) {
          event.preventDefault();
          $state.go('login');
        }

      });
    }
  ])

正如你所看到的,我在每个路由中添加了一个基本的requiresLogin,它总是重定向到login路由。那么我该如何跟踪原始URL并在登录后将用户重定向回去呢?


你可以把当前状态存储到 $rootScope 中。 - Petr Averyanov
1个回答

7

更新您的登录状态配置,包括默认参数,用于在登录时重定向到的状态名称(toState)以及传递给原始状态更改的任何参数(toParams)。如果您不定义默认值,则在检查登录控制器中的$state.params时,它们将始终为空-即使您从$stateChangeStart处理程序提供值!

  .state('login', {
    data: {'requiresLogin': false},
    params: { 
      'toState': 'profile', // default state to proceed to after login
      'toParams': {}
    },
    url: 'login',
  })

修改你的运行块以捕获并传递请求的(未经授权的)状态:

    $state.go('login', {'toState': toState.name, 'toParams': toParams});

在您的登录控制器成功处理程序中,以下内容将发送您到$stateChangeStart中指定的状态或在状态配置中声明的默认状态:
      $state.go($state.params.toState, $state.params.toParams);

“profile”,// 登录后要进入的默认状态。如何使其动态化? - Ravimallya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接