2015-08-26 78 views
3

我正在使用ui路由器处理Angular + Meteor项目。 我的问题是,当人们登录并手动去/login路线,我想直接将它们重定向到主页。Angular UI路由器将登录用户从登录路径重定向

我不想在控制器中这样做,但直接在路由中。我试过onEnter函数,但是手边没有$ meteor依赖关系来查看用户是否已登录。 那么我得到了resolvehttps://github.com/angular-ui/ui-router/wiki#resolve)。

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

途径编码(在CoffeeScript中):

.state('public.login', 
    url: '/login' 
    views: 
     "[email protected]": 
     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 
     ] 
) 

正如你所看到的,而不是通过对承诺的resolve函数的返回,我检查了承诺自己,如果用户已登录,我做一个状态改变回家。

这有效,但它感觉就像我黑客的解决功能。

我不想为位于示例8.5 @http://angular-meteor.com/tutorials/angular1/user-accounts-authentication-and-permissions中的`stateChangeError'添加一个监听器。 如果解决方案的承诺是错误的,那么他们会发现错误,在我的情况下,我做的是相反的,只有当承诺是真实的时候才想重新定位。

有什么建议吗?

*** update **** 根据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') 
    ) 
) 

回答

5

您可以在以下块

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

}); 
+1

这是我在我的应用程序正在做移动你的逻辑。您可以将此代码放入服务中,并注入所需的其他应用程序组件(例如,查找用户是否已登录)。另外,因为它现在在服务中,所以你可以为它编写单元测试。 –

+0

我照你的建议做了,我在rootScope对象内的事件对象中看到currentUser对象已解析。我会在那里做检查。这是最好的实施? – Mattijs

+0

@Mattijs - 是的。我相信是这样。 – nikhil