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
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
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();
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