Why does $state.transitionTo or $state.go does not display the new HTML partial?

后端 未结 3 1590
独厮守ぢ
独厮守ぢ 2021-01-22 09:22

Here is a piece of code destined to check user rights before each UI-router state change. Everything works fine, except the fact that when rights are OK, the transition to the n

相关标签:
3条回答
  • 2021-01-22 09:36

    I think your problem will be fixed by doing this :

    angular.module('mymodule', [ /* dependancies */ ])
    
    .run( function($rootScope, $window, $state, AuthManager, $timeout)
    {
        $rootScope.$on('$stateChangeStart',
            function(event, toState, toParams, fromState, fromParams)
            {
                if( ! S.isUserConnected() && toParams.requiresLogIn )
                {
    
                    AuthManager.openConnectionPane().then( function( data )
                    {
                        if( AuthManager.isUserConnected() ) {
                            console.log("This message is correctly printed!");
                             $timeout(function() {
                                event.preventDefault();
                                $state.go(toState.name);
                              });
    
                        }
                    });
                }
            }
        );
    });
    

    $state.go does not work correctly in .run this should be a workaround by adding the timeout

    0 讨论(0)
  • 2021-01-22 09:36

    try putting the event.preventDefault(); bellow the $state.go.

    This is where I saw the idea for this suggestion: angularjs app.run doesn't get called with state

    So basically:

    AuthManager.openConnectionPane().then( function( data ) { if( AuthManager.isUserConnected() ) { console.log("This message is correctly printed!"); $state.go( toState.name ); } }); event.preventDefault();

    0 讨论(0)
  • 2021-01-22 09:51

    I had a similar issue and this is how I solved it:

    if( AuthManager.isUserConnected() ) {
       //...
       event.preventDefault();
       $state.go(toState.name, null, {notify: false}).then(function (state) {
          $rootScope.$broadcast('$stateChangeSuccess', state, null);
       });
    }
    

    As it's mentioned in other answers, $state.go doesn't work propertly in .run. Following the advises of this thread I ended up working with this workaround

    $urlRouterProvider.otherwise(function ($injector) {
       var $state = $injector.get('$state');
       $state.go('/home');
    });
    

    Not sure if this could help you, but you could try it. Hope it helps

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