2017-10-16 5 views
0

J'essaie de restreindre l'accès à certaines pages du répertoire public en utilisant le routage angulaire.

.when('/adminprofile', { 
    templateUrl: '../partials/adminprofile.html', 
    access: {restricted: true} 
    }) 

Je suis en train de lire ce que je crois est une propriété d'accès appelé que je déclarais, appelé accès

myApp.run(function ($rootScope, $location, $route, AuthService) { 
$rootScope.$on('$routeChangeStart', 
    function (event, next, current) { 
    AuthService.getUserStatus() 
    .then(function(){ 
     if (next.access.restricted && !AuthService.isLoggedIn()){ 
     $location.path('/login'); 
     $route.reload(); 
     } 
    }); 
}); 
}); 

Mais ce que je reçois est cette erreur:

TypeError: next.access is undefined

Comment puis-je lire la propriété ou comment puis-je y parvenir d'une meilleure façon ?, Merci

EDIT:

Selon suggestion, j'ai changé le code et il semble que ce qui suit:

var myApp = angular.module('myApp', ['ngRoute']); 

myApp.config(function ($routeProvider, $locationProvider) { 
$routeProvider 
    .when('/', { 
    templateUrl: '../partials/home.html', 
    resolve: { 
     access: false 
    } 
    }) 
    .when('/home', { 
    templateUrl: '../partials/home.html', 
    resolve: { 
     access: false 
    } 
    }) 
    .when('/login', { 
    templateUrl: '../partials/login.html', 
    controller: 'loginController', 
    resolve: { 
     access: false 
    } 
    }) 
    .when('/logout', { 
    controller: 'logoutController', 
    resolve: { 
     access: false 
    } 
    }) 
    .when('/register', { 
    templateUrl: '../partials/register.html', 
    controller: 'registerController', 
    resolve: { 
     access: false 
    } 
    }) 
    .when('/adminprofile', { 
    templateUrl: '../partials/adminprofile.html', 
    resolve: { 
     access: true 
    } 
    }) 
    .otherwise({ 
    redirectTo: '/' 

    }); 

}); 

Et j'ai ma fonction d'exécution:

myApp.run(function ($rootScope, $location, $route, AuthService) { 
debugger; 
$rootScope.$on('$routeChangeStart', 
    function (event, next, current) { 
    AuthService.getUserStatus() 
    .then(function(){ 
     if (next.resolve.access && !AuthService.isLoggedIn()){ 
     $location.path('/login'); 
     $route.reload(); 
     } else{ 
     $location.path($route.current.originalPath); 
     } 
    }); 
}); 
}); 

Maintenant, je peux voir la valeur d'accès:

next.resolve.access

mais n'affiche rien, je cours en debug et peut voir Le chapeau est en train de passer par le callback $ routeChangeStart, whyyyyy ?? helppppp!

+0

essayez et inspectez "next" ou connectez-vous à la console pour voir son contenu ... y a-t-il même un accès? – floor

+0

Je ne faisais que déboguer en chrome et il dit indéfini quand je passe dessus – Juanca

+0

est en fait un Object: params {}, pathParams {}, _proto_: Object – Juanca

Répondre

0

gars ok, se fait, c'est la bonne façon de le faire:

var myApp = angular.module('myApp', ['ngRoute']); 

myApp.config(function ($routeProvider, $locationProvider) { 
$routeProvider 
    .when('/', { 
    templateUrl: '../partials/home.html', 
    resolve: { 
     access: function() { 
      return false; 
     } 
    } 
    }) 
    .when('/home', { 
    templateUrl: '../partials/home.html', 
    resolve: { 
     access: function() { 
      return false; 
     } 
    } 
    }) 
    .when('/login', { 
    templateUrl: '../partials/login.html', 
    controller: 'loginController', 
    resolve: { 
     access: function() { 
      return false; 
     } 
    } 
    }) 
    .when('/logout', { 
    controller: 'logoutController', 
    resolve: { 
     access: function() { 
      return false; 
     } 
    } 
    }) 
    .when('/register', { 
    templateUrl: '../partials/register.html', 
    controller: 'registerController', 
    resolve: { 
     access: function() { 
      return false; 
     } 
    } 
    }) 
    .when('/adminprofile', { 
    templateUrl: '../partials/adminprofile.html', 
    resolve: { 
     access: function() { 
      return true; 
     } 
    } 
    }) 
    .otherwise({ 
    redirectTo: '/' 

    }); 

}); 

myApp.run(function ($rootScope, $location, $route, AuthService) { 
debugger; 
$rootScope.$on('$routeChangeStart', 
    function (event, next, current) { 
    AuthService.getUserStatus() 
    .then(function(){ 
     if (next.resolve.access && !AuthService.isLoggedIn()){ 
     $location.path('/login'); 
     $route.reload(); 
     } 
    }); 
}); 
}); 

résolution doit être une fonction

Resolve will open your route with a resolved variable (that can be injected into controller) as soon as it gets value (instantly or when returned promise will be resolved)

comme il ne retournerait pas une valeur, le routeur semble être bloqué en attente d'une valeur à résoudre.