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)
您可以在以下块中移动逻辑
$rootScope.$on( "$stateChangeStart", function(event, toState, toParams, fromState, fromParams) {
// logic
});
Run Code Online (Sandbox Code Playgroud)