如何访问ui-router $ transitions中的先前状态?

时间:2017-04-04 19:06:46

标签: javascript angularjs angular-ui-router

这是我的.run功能:

.run(function ($transitions, UserService) {
    $transitions.onStart({ to: function(state) {
        return state.data != null && state.data.requireLogin === true && UserService.getUser().isLogged !== true;
    }},function(trans){
        var AuthService = trans.injector().get('AuthService');
        var $q = trans.injector().get('$q');
        var $state = trans.injector().get('$state');
        var defer = $q.defer();
        AuthService.login().then(function (status){
            if(status === 'login'){
                defer.resolve(true);
            }else if (status === 'register'){
                defer.resolve($state.target('map.register'));
            }
        }, function (msg){
            //  Here is part that I am asking for
            defer.resolve(false);
        });

        return defer.promise;   
    });
});

基本上,如果转换到需要登录且未登录用户的状态,则使用transitionHookFn。在那里,我使用AuthService.login()并返回状态承诺。如果AuthService.login()失败(用户取消),则promise将返回false并取消转换,从而使用户处于相同的状态。

当用户在首次加载时尝试访问受限页面并取消登录时问题开始,因为没有先前的状态且整个页面只是空白。

如果有先前的状态,是否有办法取消转换,如果没有,则重定向到主页?我需要访问以前的状态,看看它是否存在。

1 个答案:

答案 0 :(得分:0)

要重定向到主页,您可以使用

app.config(function($urlRouterProvider){
    $urlRouterProvider.otherwise('YOUR-HOME-STATE');
});

您也可以使用

app.run(function($transitions, SOME-SERVICE) {
    $transitions.onSuccess({ to: 'SOME-STATE' }, function(trans) {
        //Here you can call your service and based on conditions 
        //you can make transition to previous state by calling its name
        //or to your default state
        if(SOME-CONDITION){
            return trans.router.stateService.go('PREVIOUS-STATE');
        } else {
            return trans.router.stateService.go('DEFAULT-STATE');
        }
    });
});

请注意,您也可以使用stateParams更好地用作$transition$参数:

trans.params().PARAM-NAME