2016-08-07 9 views
2

Ich versuche zu verhindern, dass der Benutzer direkt zu Lesezeichen-URL gehen, wenn nicht angemeldet (vielleicht sollte ich herausfinden, wie nur eine URL anzuzeigen, egal was Zustand ?). Wenn der Benutzer angemeldet ist, wird $scope.serverToken festgelegt.AngularJS UI-Router Rätsel - kann nicht zum Login-Bildschirm wechseln

Wenn nicht, möchte ich Zustand index.login ändern - ABER der Login-Dialog nicht angezeigt wird - vielleicht wegen der ersten Prüfung in der Funktion ??

Was mache ich falsch?

$rootScope.$on('$stateChangeStart', 
     function(event, toState, toParams, fromState, fromParams) 
     { 
      if (toState == fromState) 
       return; 

      if (fromState.name == "") 
      { 
       $scope.serverToken = ""; 
       event.preventDefault(); 
       $scope.SetLoginDialog('login'); 
       $state.go("index.login"); 
       return; 
      } 

      // Take the user to the login page if server token expired only if user is not already transitioning to the 
      // login page 
      if (($scope.serverToken == "") && (toState.name !== 'index.login')) 
      { 
       console.warn('Attempt to go directly to URL without logging in'); 
       event.preventDefault(); 
       $scope.SetLoginDialog('login'); 
       $state.go("index.login"); 
       return; 
      } 

      var url = HOST + 'api/is_user_logged_in.php?token=' + $scope.serverToken; 
      console.log('Check if user is logged in at ' + url); 

      $http.get(url) 
       .success(function(data, status, headers, config) 
        { 

Zustandsänderungen sind ein Menü über die Einträge wie diese auch ich Ihnen helfen könnte helfen ...

$stateProvider 

    .state('index', { 
     abstract: true, 
     url: "/index", 
     templateUrl: "views/common/content.html", 
    }) 

    .state('index.login', { 
     url: "/login", 
     templateUrl: "views/login.html", 
     data: { pageTitle: 'Login' } 
    }) 

    .state('index.overview', { 
     url: "/overview", 
     templateUrl: "views/overview.html", 
     data: { pageTitle: 'Overview' } 
    }) 

    .state('index.events', { 
     url: "/events", 
     templateUrl: "views/events.html", 
     data: { pageTitle: 'Events' }, 
    }) 

Hier einige meiner Controller Diese

<li ui-sref-active="active">     
    <a ui-sref="index.events"><i class="fa fa-desktop"></i> <div class="nav-label">Events</div></a> 
</li>  

sehen ist, in Fall es hilft ...

angular 
    .module('MyApp') 
    .controller('MainCtrl', MainCtrl) 

function MainCtrl($rootScope, $scope, $http, $interval, $state, $location) 
{ 
+1

Ich nehme an, Sie haben einen Controller für mehrere Zustände? kannst du es zeigen? Es ist möglich, dass Sie den Controller bei jedem Zustandswechsel initialisieren und somit den Dialog "zerstören". – AranS

+0

Ja, ich habe einen Mega Controller für mehrere Zustände, 2k + Leitungen und weit zu groß zum Posten :-(Welcher Teil würde "Initialisierung des Controllers" anzeigen in jedem Zustand ändern "? Ich benutze ein Framework, das Menü-Schaltflächen hat & behandelt Zustandsänderung, so dass es unwahrscheinlich ist, falsch zu sein. – Mawg

+1

können Sie Ihren Routing-Code anzeigen? die State-Deklaration? vielleicht können wir eine Lösung finden, indem Sie die Spezifischer Status (wenn der Controller diesen Dialog anzeigt) – AranS

Antwort

0

if (toState.name == 'index.login')return; verhindert eine Änderung des Status von index.login.

if (fromState.name == 'index.login')return; tun wird, den Übergang einmal, wenn nicht bereits in Einbuchzustand

Update:

Ich denke, Sie einen anderen Endlosschleife erstellt. Wenn Sie die App mit einem anfänglichen "" -Zustand eingeben, wird dies hier immer der Fall sein und jeden Übergang unterbrechen. Versuchen

if (fromState.name == "") 
    { 
       $scope.serverToken = ""; 
       event.preventDefault(); 
       $scope.SetLoginDialog('login'); 
       $state.go("index.login"); 
       return; 
    } 

if (fromState.name == "" && toState.name!=="index.login") 
+0

Sorry Ich war mir sicher, dass es das tun würde, aber es scheint, als ob mein Kommentar ** korrekt war. Wenn ich das 'if (toState.name == 'index.login') return;' lösche, bekomme ich eine unendliche Zahl 'Versuch, direkt zur URL zu gehen, ohne mich anzumelden', also habe ich immer noch ein Problem. Sorry dafür, dass du so schnell (und so falsch) sagst, dass du die Antwort bekommen hast :-( – Mawg

+1

versuche es dann so: ' if (fromState.name == 'index.login') return; ' Mit dem fromState können Sie den Übergang einmal durchführen, wenn nicht bereits im Login-Status –

+0

Ich habe die Frage aktualisiert. Könnten Sie bitte ein anderes Aussehen haben? – Mawg

1

Ich denke, das ist einfach. Ändern Sie einfach Ihre Funktion wie folgt:

function (event, toState, toParams, fromState, fromParams) { 
    // Take the user to the login page if server token expired only if user is not already transitioning to the 
    // login page 
    if (!$scope.serverToken && toState.name !== 'index.login') { 
     console.warn('Attempt to go directly to URL without logging in'); 
     $scope.SetLoginDialog('login'); 
     $state.go("index.login"); 
     return; 
    } 
} 
+0

Ich verstehe nicht - es ist immer noch Looping :-( – Mawg

+0

Gibt es zusätzlichen Code in dieser Funktion? Und können Sie ein funktionierendes Beispiel geben, das dieses Problem auf Plunkr/Fiddle reproduziert? –

+0

Ich habe die Frage aktualisiert. Könnten Sie bitte einen anderen Blick haben? – Mawg