Angular ui-router $state.go is not redirecting inside resolve

后端 未结 6 960
刺人心
刺人心 2021-02-05 04:57

In my angularjs app, I am checking if user lands on landing page and is already authenticated, then redirect him to home page.

.state(\'landingpage\', {
                 


        
相关标签:
6条回答
  • 2021-02-05 05:13

    There can be two solutions to your problem

    • Firstly you can emit an event and the listener will handle your state transition. You can implement the listener in anywhere in a parent controller

    • Secondly you can implement the $stateChangeStart hook and check your redirection condition there

      $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');           
              }
            }
      });
      
    0 讨论(0)
  • 2021-02-05 05:28

    This is an old thread, but I use $location.path() to accomplish redirection inside of a state.resolve() block

    0 讨论(0)
  • 2021-02-05 05:29

    Anyway resolve waiting for promise state . Best thing what you can do is return promise and add timeout for your state:

    resolve: {
        AutoLoginCheck: ['$state', '$window', '$timeout', '$q', function ($state, $window, $timeout, $q) {
            var deferred = $q.defer();
            if(user.isLogin()){
                 deferred.resolve();
            }else{
              $timeout(function(){
                $state.go('app.home');
              }
              deferred.reject();
            }
            return deferred.promise;
        }]
    
    0 讨论(0)
  • 2021-02-05 05:32

    You can use resolve to provide your controller with content or data that is custom to the state. resolve is an optional map of dependencies which should be injected into the controller.

    You could have a controller that checks for the AuthState and have the redirection accordingly.

         .state('landingpage', {
            abstract: "true",
            url: "/landingpage",
            templateUrl: "app/landingpage/landingpage.html",
            resolve: {
                AutoLoginCheck: ['$window', function ($window) {
    
                    if($window.localStorage.access_token != null)
                    {
                        if($window.sessionStorage.access_token == null) {
                            $window.sessionStorage.access_token = $window.localStorage.access_token;
                        }
    
                       //assuming userInfoService does the authentication
                        var isAuthenticated = userInfoService.SetUserAuthenticated(true);
                        return isAuthenticated;
    
                    }
                }]
            },
            controller: ['$state','AutoLoginCheck', function($state, AutoLoginCheck){
              if(AutoLoginCheck){
                //authenticated
                $state.go('app.home');
              } else {
                //redirect to unauthenticated page
                $state.go('....');
              }
            }]
        })
    
    0 讨论(0)
  • 2021-02-05 05:37

    You can use $location.url('/') instead.

    0 讨论(0)
  • 2021-02-05 05:39
    .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()
    
                        }
                    }]
                }
            })
    

    This would work for you.

    0 讨论(0)
提交回复
热议问题