AngularJS - отключить некоторые маршруты

0

Как уже говорит название, я пытаюсь отключить некоторые маршруты. Я использую проект углового семени, который уже имеет хорошую структуру.

Я использую 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();
        }
    });
}])

Здесь "тест" никогда не отображается в консоли.

Теги:

1 ответ

0

Вам нужно только решить, если вы позволяете пользователю в запретную зону с 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

  • 0
    Я не могу заставить это работать. Я обновил свой вопрос вашим решением, но, похоже, оно не работает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню