Ui-Router $state.go inside $on('$stateChangeStart') is cauzing an infinite loop

前端 未结 6 1818
南方客
南方客 2020-12-03 10:52

I\'m trying to introduce login into the way the user navigates accross the application.

I pretend to redirect the user to the page were he was before he navigate to

6条回答
  •  北荒
    北荒 (楼主)
    2020-12-03 11:45

    The infinite loop is partly caused by

    if (toState.name == 'login' ...) { $state.go('login'); ...
    

    ..which says if you're going to the login state, then go to the login state.

    ...And calling event.preventDefault() as the first line in the event handler doesn't help. When you use go() to go to the login screen (or anywhere else), that state change is also prevented by event.preventDefault(). It should only be used within an if.

    Your entire $stateChangeStart handler should instead be...

    if (!Auth.isLoggedIn() && toState.name != 'login') {
        event.preventDefault();
        Auth.desiredState = toState.name;
        $state.go('login');
    }
    

    ...which reads naturally. "If you're not logged in and you're not already going to the login screen, then stop what you're doing, I'll remember where you wanted to go, and you now go to the login screen."

    Later your Auth object will issue a $state.go(Auth.desiredState) when it's satisfied with the user.

提交回复
热议问题