2016-07-12 11 views
1

Ich benutze AngularJS UI Router Resolves zur Überprüfung, ob der Benutzer authentifiziert ist. Aber es heißt nur einmal. Die erste funktioniert so, wie sie sollte, aber wenn ich versuche, die Seite erneut einzugeben, überspringt sie den Auflösungsabschnitt und öffnet die Seite.AngularJS UI-Router Resolve nicht zum zweiten Mal angerufen

.state('login', { 
    url: "/login/:state/:stateParams", 
    templateUrl: "views/main.html", 
    params: { 
      stateParams: "" 
     } 
    }) 
.state('placeorder', { 
    url: "/placeorder", 
    templateUrl: "views/placeorder.html", 
    params: { 
     newOrder: { 
      from: null, 
      to: null, 
      selectedLogType: null, 
      selectedLogSubType: null 
     } 
    }, 
    resolve: { 
     auth: function ($cookies, $stateParams, $location) { 
      if (!angular.isDefined($cookies.get('token'))) { 
       $location.path('/login/placeorder/'+JSON.stringify($stateParams.newOrder)); 
      } 
      else { 
       authService.checkToken().then(function (d) { 
       if (d == false) { 
         $location.path('/login/placeorder/'+JSON.stringify($stateParams.newOrder)); 
        } 
       }); 
      } 
     } 
    } 
}); 

UPDATE: Ich habe es wie folgt geändert, und es funktioniert, wenn kein Cookie gesetzt wird, aber für die Asynchron-Funktion tut es Arbeit. Wenn ich mich anmelde, funktioniert es nicht ($ q.resolve part)

.state('placeorder', { 
    url: "/placeorder", 
    templateUrl: "views/placeorder.html", 
    params: { 
     newOrder: { 
      from: null, 
      to: null, 
      selectedLogType: null, 
      selectedLogSubType: null 
     } 
    }, 
    controller: "placeOrderCtrl", 
    resolve: { 
     auth: function ($q, $cookies, $timeout, $stateParams, $state) { 
      var defer = $q.defer(); 
      if (!angular.isDefined($cookies.get('token'))) { 
       $timeout(function() { 
        $state.go('/login/placeorder/'+JSON.stringify($stateParams.newOrder)); 
       }); 
       defer.reject(); 
      } 
      else { 
       authService.checkToken().then(function (d) { 
        if (d == false) { 
         $timeout(function() { 
          $state.go('/login/placeorder/'+JSON.stringify($stateParams.newOrder)); 
         }); 
         defer.reject(); 
        } 
        else 
        { 
         defer.resolve(); 
        } 
       }); 
      } 
      return defer.promise; 
     } 
    } 
}) 

Jetzt löst es einfach nicht auf.

+0

Könnten Sie bitte einige weitere Details über die staatliche Hierarchie des ui-Routers hinzufügen? Verweisen Sie wahrscheinlich auf denselben Status, der bereits aktiv ist? Wenn der Controller nicht erneut installiert werden muss, wird er auch nicht erneut aufgelöst. –

+0

Ja, ich tue ... Das erste Mal, wenn ich den Status anrufe, wird er zu "login" umgeleitet, das zweite Mal, wenn ich ihn anrufe, wird er zu "placementorder" umgeleitet (ohne Entschlossenheit einzugeben). Wie man es jedes Mal auflösen kann? –

+0

Ich versuche Reload zu verwenden: True, wenn der Status aufgerufen wird, aber auch nicht auf diese Weise wiederhergestellt wird. $ state.go ("placementorder", {newOrder: $ scope.newOrder}, {reload: true}); –

Antwort

0

Ok, Endlich habe ich die Lösung gefunden. Danke trotzdem :)