2016-10-10 4 views
0

Ich habe versucht, einen Zuhörer zu implementieren, die auf das Zustandsänderungsereignis so etwas wie dies, indem Sie hören konnten:AngularJS ui-Router Zustandsänderung Zuhörer

$rootScope.$on('$stateChangeStart', function (event) { 
    if (!AuthenticationService.isLoggedIn()) { 
    console.log('DENY'); 
    event.preventDefault(); 
    $state.go('login'); 
    } 
    else { 
    console.log('ALLOW'); 
    $state.go('/home'); 
    } 
});  

Aber das wird nicht funktionieren wie erwähnt here, dass es ist veraltet und transitions sollte anstelle von ihnen verwendet werden, so habe ich versucht, so etwas wie:

$transitions.onStart({}, function() { 
    if (!AuthenticationService.isLoggedIn()) { 
    console.log('DENY'); 
    return $state.target('login'); 
    } 
    else { 
    console.log('ALLOW'); 
    return $state.target('home'); 
    } 
});  

Dies ist ein Fehler heraus geben:

app.js:21 Error: Too many Transition redirects (20+) 
at Transition.run (app.js:18) 
at app.js:21 
at processQueue (app.js:10) 
at app.js:10 
at Scope.$eval (app.js:10) 
at Scope.$digest (app.js:10) 
at Scope.$apply (app.js:10) 
at app.js:6 
at Object.invoke (app.js:7) 
at doBootstrap (app.js:6)StateService._defaultErrorHandler @ app.js:21  

Irgendwelche Ideen, was schief gehen könnte? Danke im Voraus.

+0

haben Sie versucht, diese [vorgeschlagene Option] (https: // GitHub. com/eckig-ui/ui-router/issues/2720 # issuecomment-216268572)? –

Antwort

0

Das Problem ist, dass Sie eine Zustandsänderung zwingen durch ein Tun

return $state.target('home') 

Dies führt zu einem weiteren Übergang zu schießen, und es wird auf die gleiche Entscheidung treffen und das andere tun

return $state.target('home') 

Ich denke du solltest hier keinen Zustand erzwingen, lass es einfach weitergehen :)

+0

Danke für die Antwort, aber wo mache ich dann den Status auf "Login" ändern, wenn der Benutzer nicht authentifiziert wird, wenn er einen Status ändert? – newbie

+0

Wo Sie eine state.go ('Login') ist in Ordnung, müssen Sie nicht nach/home umleiten, lass es einfach sein, und das Problem wird weg – Mikkel

0

Du kannst so etwas machen. Nicht getestet, aber es sollte funktionieren.

app.run(function ($state,AuthenticationService, $rootScope) { 
$rootScope.$on('$stateChangeStart', function (event) { 
    if (!AuthenticationService.isLoggedIn()) { 
    console.log('DENY'); 
    event.preventDefault(); 
    $state.go('login'); 
    } 
    else { 
    console.log('ALLOW'); 
    $state.go('/home'); 
    } 
}); 
}) 
+0

Ich versuchte dies früher, aber es geht in eine Endlosschleife Sprichwort "Wert: Fehler: Übergang ersetzt" – newbie

0

Vielleicht haben Sie vergessen aktuellen Zustand zu überprüfen und Sie haben

"Too many Transition redirects"

so etwas wie dieses Versuchen:

$rootScope.$on('$stateChangeStart', function (event, toState, toParams) { 
    if (!AuthenticationService.isLoggedIn()) { 
     console.log('DENY'); 
     if (toState.name !== 'login') { 
      event.preventDefault(); 
      $state.go('login'); 
     } 
    } else { 
     console.log('ALLOW'); 
     if (toState.name !== 'home') { 
      event.preventDefault(); 
      $state.go('home'); 
     } 
    } 
});