2014-07-07 4 views
9


genannt Ich habe eine Angular JS App mit einem Back-End-Sails JS, und innerhalb der Routen (in app.js) Ich habe:

.state('app.detail', { 
    url: "/detail", 
    views: { 
    'menuContent' :{ 
     templateUrl: "templates/detail.html", 
     controller: 'UserUpdateCtrl', 
     resolve: { 
     auth: ["$q", "userData", function($q, userData) { 
      var userInfo = userData.getUserInfo(); 
      if (userInfo) { 
      return $q.when(userInfo); 
      } else { 
      return $q.reject({ authenticated: false }); 
      } 
     }] 
     }, 
    } 
    } 
}) 

(diese folgt this guide)

nun auf der gleichen Datei haben, ich die $ routeChangeError:

.run(function($rootScope) { 
    $rootScope.$on("$routeChangeError", function(event, current, previous, eventObj) { 
    if (eventObj.authenticated === false) { 
     $location.path("/login"); 
    } 
    }); 

Wenn Debugging auf Chrome, sehe ich, dass die Funktion definiert ist, aber nicht aufgerufen.
Was fehlt mir hier?

+0

vielleicht haben Sie nicht ? –

+5

Ziemlich sicher, Sie wollen '$ stateChangeError' ... – ivarni

+0

Ok, es ruft' $ stateChangeError' aber die 'eventObj.authenticated' var ist undefined (eventObj:' Objekt {name: "", url: "^", Ansichten: null , abstract: true} ') – Asaf

Antwort

9

Okay, unter der Annahme, dass Sie den Angular UI Router verwenden, glaube ich, dass Sie den Fehlerhandler nur falsch vom offiziellen übersetzen.

Vom docs for $state:

Fired when an error occurs during transition. It's important to note that if you have any errors in your resolve functions (javascript errors, non-existent services, etc) they will not throw traditionally. You must listen for this $stateChangeError event to catch ALL errors.

und die Parameter für diesen Handler unterschiedlich sind, versuchen Sie dies so etwas wie:

$rootScope.$on("$stateChangeError", function(event, toState, toParams, fromState, fromParams, error) { 
    if (error && !error.authenticated) { 
    $location.path("/login"); 
    } 
}); 

Hier ist eine Beschreibung der Parameter mit dem wichtigen ein bolded:

  • Ereignis - {Objekt} - Ereignisobjekt.
  • toState - {Status} - Der Status, in den gewechselt wird.
  • toParams - {Object} - Die an den toState gelieferten Parameter.
  • fromState - {Status} - Der aktuelle Status, vor dem Übergang.
  • fromParams - {Objekt} - Die Parameter, die an den fromState geliefert werden.
  • Fehler - {Fehler} - Das Fehlerlösungsobjekt.
+0

Alles funktioniert, aber der '$ location.path', der aus irgendeinem Grund nicht umleitet (der Pfadteil ist korrekt, wenn das hilft) – Asaf

+3

Komm schon man gibt hier ein Muster mit deinen Problemen, du verwendest $ state statt $ location . Lesen Sie die Dokumentation, es sollte wahrscheinlich '$ state.go()' oder so etwas sein. – Terry

+1

Vielen Dank, manchmal bringt angularjs mich dazu zu vergessen, wie grundlegende Logik funktioniert. – Asaf