我正在使用ui路由器处理Angular + Meteor项目。 我的问题是,当人们登录并手动去/login
路线,我想直接将它们重定向到主页。Angular UI路由器将登录用户从登录路径重定向
我不想在控制器中这样做,但直接在路由中。我试过onEnter函数,但是手边没有$ meteor依赖关系来查看用户是否已登录。 那么我得到了resolve
(https://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')
)
)
这是我在我的应用程序正在做移动你的逻辑。您可以将此代码放入服务中,并注入所需的其他应用程序组件(例如,查找用户是否已登录)。另外,因为它现在在服务中,所以你可以为它编写单元测试。 –
我照你的建议做了,我在rootScope对象内的事件对象中看到currentUser对象已解析。我会在那里做检查。这是最好的实施? – Mattijs
@Mattijs - 是的。我相信是这样。 – nikhil