Как уже говорит название, я пытаюсь отключить некоторые маршруты. Я использую проект углового семени, который уже имеет хорошую структуру.
Я использую JWT, и я пытаюсь настроить структуру, где, если определенный маршрут требует входа пользователя в систему, и пользователь не входит в систему, он перенаправляет его на другую страницу.
На моем angular.module
я добавил следующий код:
.run(['$rootScope', 'userService', '$location', function($rootScope, userService, $location) {
userService.init();
$rootScope.$on('$routeChangeStart', function(event, next, current) {
$rootScope.isPrivate = next['authenticate'];
if ($rootScope.isPrivate) {
if (!userService.get())
$location.path('/');
}
});
}]);
И это защищенный маршрут:
angular.module('myApp.view2', ['ngRoute', 'ngCookies'])
.config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/admin/vnos-stevilke', {
templateUrl: 'view2/view2.html',
controller: 'View2Ctrl',
authenticate: true
}).when('/admin/vnos-stevilke/:id', {
templateUrl: 'view2/view2.html',
controller: 'View2Ctrl',
authenticate: true
});
}])
.controller('View2Ctrl', ['$scope', 'webServices', '$location', '$routeParams', function($scope, webServices, $location, $routeParams) {
if ($routeParams.id)
webServices.getBranchById($routeParams.id, function(err, data) {
$scope.branch = data;
});
webServices.getCompanies(function(err, data) {
console.log(data);
console.log('no access!');
if (!err)
$scope.companies = data;
});
}]);
теперь поначалу он работает нормально: если я не зашел в систему, маршрут не отображается, и я перенаправляюсь обратно к корню. Но при более близком рассмотрении я заметил, что console.log('no access!');
все еще отображается в консоли. Таким образом, кажется, что контроллер инициализируется.
Кажется, что весь маршрут загружен, а затем перенаправляется, если пользователь не вошел в систему. Это не то поведение, которое я ищу. Я пытаюсь ДЕРЖАТЬ загрузку маршрута, пока я не уверен, что пользователь вошел в систему.
Есть идеи?
ОБНОВИТЬ:
Я изменил код соответственно с предложением ниже, но он, похоже, не работает. Где я ошибся?
userService, который проверяет, вошел ли пользователь в систему:
this.isLogged = function() {
var deferred = $q.defer();
if (current === null) return deferred.reject();
else return deferred.resolve(current);
};
Метод запуска:
.run(['$rootScope', 'userService', '$location', function($rootScope, userService, $location) {
userService.init();
$rootScope.$on('$routeChangeError', function() {
$location.path('/');
});
}]);
Ограниченная страница:
.config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/admin/vnos-stevilke', {
templateUrl: 'view2/view2.html',
controller: 'View2Ctrl',
resolve: function(userService) {
console.log('test');
return userService.isLogged();
}
});
}])
Здесь "тест" никогда не отображается в консоли.
Вам нужно только решить, если вы позволяете пользователю в запретную зону с resolve
параметром маршрута. Если в одной из функций разрешения разрешается отклонение объекта обещания, он перестает вводить запрошенный маршрут.
Я бы написал что-то вроде:
$routeProvider.when('/restrictedURL',{
...some params,
resolve: function(userService){
return userService.get();
}
}
... и заставить userService.get возвращать объект Promise, который разрешен, если сеанс активен и в противном случае отклоняется.
Теперь.. если обещание отклонено, маршрут не будет запущен, а событие $ routeChangeError будет поднято, поэтому вам нужно что-то вроде:
angular.module('yourapp').run(function($rootScope){
$rootScope.$on("$routeChangeError",function(){
$location.path('/');
});
});
подробнее о параметре разрешения @https://docs.angularjs.org/api/ngRoute/provider/$routeProvider