Угловые параметры маршрута от начала изменения местоположения

У меня есть настройка маршрутов так:

app.config(function($routeProvider) {

 $routeProvider

 //login
 .when("/", {
 templateUrl : "framework/views/login.html",
 controller : "LoginCtrl",
 title: "Login",
 authenticate: false
 })

 //dashboard
 .when("/dashboard", {
 templateUrl : "framework/views/dashboard.html",
 controller : "DashboardCtrl",
 title: "Dashboard",
 authenticate: true
 });
});

Теперь я хочу перенаправить изменения местоположения, если для authenticate установлено значение true на маршруте, но session variable не true.

Например:

$rootScope.$on("$locationChangeStart", function(event, newURL, oldURL){ 
 if (toState.authenticate && $window.sessionStorage.isLoggedIn) {
 $location.path("/");
 }
});

Это работает, если вместо этого я использую $routeChangeStart, но затем я вижу следующий маршрут ненадолго, прежде чем перенаправлять. Изменение местоположения, похоже, останавливает это, но я не могу решить, как получить доступ к параметрам маршрута (то есть параметр аутентификации).

Как мне это сделать? Или есть лучший способ?

2 ответа

вы должны использовать параметр разрешения в.when(). Это действует как обещание, в котором вы можете установить определенные критерии, которые должны быть выполнены до визуализации представления. Здесь вы можете найти хорошее демо-видео: https://egghead.io/lessons/angularjs-resolve


Как я сказал в комментарии и по запросу Купера, я приведу пример:

angular.module('myApp',[])
 .factory('httpInterceptor', ['$q', '$location',function ($q, $location) {
 var canceller = $q.defer();
 return {
 'request': function(config) {
 // promise that should abort the request when resolved.
 config.timeout = canceller.promise;
 return config;
 },
 'response': function(response) {
 return response;
 },
 'responseError': function(rejection) {
 if (rejection.status === 401) {
 canceller.resolve('Unauthorized'); 
 $location.url('/user/signin');
 }
 if (rejection.status === 403) {
 canceller.resolve('Forbidden'); 
 $location.url('/');
 }
 return $q.reject(rejection);
 }

 };
 }
 ])
 //Http Intercpetor to check auth failures for xhr requests
 .config(['$httpProvider',function($httpProvider) {
 $httpProvider.interceptors.push('httpInterceptor');
 }])
 .config(['$stateProvider',function($stateProvider) {

 // states for users
 $stateProvider
 .state('users', {
 abstract: true,
 templateUrl: 'users/views/users.html',
 resolve: {
 issessionedin: function(Sessions){
 return Sessions.isLoggedIn();
 } 
 }
 })
 .state('users.account', {
 url: '/user/account/:id',
 templateUrl: 'users/views/account.html',
 resolve: {
 user: function(Users, $stateParams){
 return Users.get($stateParams.id);
 }
 },
 controller:'UserAccountController'
 })
 }])
 .factory('Sessions', ['$http',
 function($http) {
 return{
 isSessionedIn :function() {
 $http.get('/api/v1/issessionedin');
 },
 isLoggedIn :function() {
 $http.get('/api/v1/isloggedin');
 },
 hasAccess :function(permission) {
 $http.get('/api/v1/hasaccess/'+permission);
 }
 };
 }
 ]);

конечно, вам нужна сторона сервера кода, чтобы вернуть код статуса http

licensed under cc by-sa 3.0 with attribution.