Angular UI-Router重定向登录用户远离登录路由

Mat*_*ijs 3 angularjs meteor angular-ui-router

我正在使用ui-router开展Angular + Meteor项目.我的问题是,当人们登录并手动转到/login路线时,我想将它们直接重定向到主页.

我不想在控制器中执行此操作,而是直接在路径中执行此操作.我尝试了onEnter函数,但是手头上没有$ meteor依赖项来查看用户是否已登录.所以我得到了resolve(https://github.com/angular-ui/ui-router/wiki#解决).

有了这个,我创造了一个有效的解决方案,但是感觉有点像黑客,我会喜欢一些关于如何删除hacky部分的反馈或建议.

路线代码(在coffeescript中):

.state( 'public.login',
    url: '/login'
    views:
      "container@public":
        templateUrl: 'client/views/session/login.html'
        controller: 'SessionCtrl'
    resolve:
      'currentUser': [ '$meteor', '$state', ( $meteor, $state )->
        $meteor.waitForUser().then( ( user )->
          if user
            $state.go( 'private.home' )
        , ( error ) ->
          console.log("error", error)
        )
        return
      ]
  )
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,我不会将承诺作为resolve函数的返回传递,而是自己检查承诺,如果用户已登录,我会将状态更改回Home.

这有效,但感觉就像我正在破解解析功能.

我不想在示例8.5 @ http://angular-meteor.com/tutorials/angular1/user-accounts-authentication-and-permissions中添加一个"stateChangeError"的监听器.如果解决承诺是假的,那么他们就会捕获错误,在我的情况下,我会做相反的事情并且只想在promise为真时重新定位.

有什么建议?

***更新****根据Nikhil的建议添加了此解决方案.谢谢你!

angular.module( 'myApp' ).run(
  ( $rootScope, $location, $state ) ->
     $rootScope.$on( '$stateChangeStart', ( event, toState, toParams, fromState, fromParams ) ->

     if toState.name is 'public.login'
       if event and event.targetScope and event.targetScope.currentUser
         #to prevent login view to be displayed, I prevent default
         event.preventDefault(); 
         $state.go( 'private.home' )
     )
)
Run Code Online (Sandbox Code Playgroud)

Nik*_*wal 5

您可以在以下块中移动逻辑

$rootScope.$on( "$stateChangeStart", function(event, toState, toParams, fromState, fromParams) {
     // logic

});
Run Code Online (Sandbox Code Playgroud)