Angular ui-router $ state.go不会重定向内部解析

Sam*_*Sam 24 angularjs angular-ui-router

在我的angularjs应用程序中,我正在检查用户是否登陆着陆页并且已经过身份验证,然后将其重定向到主页.

.state('landingpage', {
            abstract: "true",
            url: "/landingpage",
            templateUrl: "app/landingpage/landingpage.html",
            resolve: {
                AutoLoginCheck: ['$state', '$window', function ($state, $window) {

                    if($window.localStorage.access_token != null)
                    {
                        if($window.sessionStorage.access_token == null) {
                            $window.sessionStorage.access_token = $window.localStorage.access_token;
                        }
                        UserInfoService.SetUserAuthenticated(true);

                        // it is not redirecting
                        return $state.go('app.home');

                    }
                }]
            }
        })
Run Code Online (Sandbox Code Playgroud)

问题是虽然所有解析代码都成功运行,但用户没有被重定向到app.home.有人能说出为什么会这样吗?

注意:状态'app'还有一个解决方案,它可以获取要在'app.home'状态下显示的数据.

Shy*_*azi 27

.state('landingpage', {
            abstract: "true",
            url: "/landingpage",
            templateUrl: "app/landingpage/landingpage.html",
            resolve: {
                AutoLoginCheck: ['$state','$window', '$q','$timeout', function ($state, $window,$q,$timeout) {

                    if($window.localStorage.access_token != null)
                    {
                        if($window.sessionStorage.access_token == null) {
                            $window.sessionStorage.access_token = $window.localStorage.access_token;
                        }
                        UserInfoService.SetUserAuthenticated(true);


                        $timeout(function() {
                           $state.go('app.home')
                        },0);
                        return $q.reject()

                    }
                }]
            }
        })
Run Code Online (Sandbox Code Playgroud)

这对你有用.

  • @Robert:内部决心唯一可能的是拒绝或解决承诺.我认为state.go()是不可能的,除非我们使用超时在callstack中添加它. (3认同)
  • 我做了类似于此但没有$ timeout,如下所示:`return $ q.reject().catch(function(){$ state.go('app.home'); return $ q.reject();}) `然后你降低注入次数 (3认同)

ptw*_*two 15

您的问题可以有两种解决方案

  • 首先,您可以发出一个事件,监听器将处理您的状态转换.您可以在父控制器中的任何位置实现侦听器

  • 其次,您可以实现$ stateChangeStart挂钩并检查您的重定向条件

    $rootScope.$on('$stateChangeStart', function (event, toState) {      
         if (toState.name === 'landingpage') {              
           if (!isAuthenticated()) { // Check if user allowed to transition                  
                event.preventDefault();   // Prevent migration to default state                  
                $state.go('home.dashboard');           
            }
          }
    });
    
    Run Code Online (Sandbox Code Playgroud)


Joe*_*any 13

你可以$location.url('/')改用.