Angularjs $location.path(‘…’) не работает

#angularjs #location

#angularjs ( ангулярджс ) #Расположение #angularjs

Вопрос:

Я работаю над аутентификацией с помощью angularjs, поэтому после подключения моего пользователя я хочу перенаправить его на домашнюю страницу:

 $scope.submit = function(user) {
    var request = {
        method: 'POST',
        url: 'http://localhost:9001/signIn',
        headers: {
            'Content-Type': 'application/json'
        },
        data: {
            "email": user.email,
            "password": user.password,
            "rememberMe": true
        }
    };
    $http(request).then(function(data) {
            $location.path('/home');
    }, function(error) {
        console.log(error);
    });
};
  

вот моя конфигурация:

 app.config(function($urlRouterProvider, $stateProvider, $httpProvider, $authProvider) {
    $urlRouterProvider.otherwise('/home');
    $stateProvider
        .state('home', {
            url: '/home',
            templateUrl: '/home',
            controller: 'HomeCtrl',
            resolve: {
                authenticated: function($q, $location, $auth) {
                    var deferred = $q.defer();

                if (!$auth.isAuthenticated()) {
                    $location.path('/signIn');
                } else {
                    deferred.resolve();
                }

                return deferred.promise;
            }
        }
    })
    .state('signIn', {
        url: '/signIn',
        templateUrl: '/signIn',
        controller: 'SignInCtrl'
    });
});
  

Я пробовал это:

     $http(request).then(function(data) {
        $scope.$evalAsync(function() {
            $location.path('/home');
        });
        console.log(data);
    }, function(error) {
        console.log(error);
    });
  

также :

 $location.path('/home');
$location.replace();
  

Ни одно из вышеперечисленных действий не работает, любая помощь приветствуется.

Комментарии:

1. $http Запрос определенно выполнен успешно? Вы внедряете $location в контроллер? Это не продемонстрировано в вашем вопросе.

2. да! Я думаю, что у меня проблема с разрешениями: / спасибо за ваш ответ

3. Что за ошибку вы получаете?

Ответ №1:

home Функция определения состояния не может разрешить или отклонить $q.defer обещание, когда $auth.isAuthenticated() возвращает false. Это приведет к зависанию promise и создаст утечку памяти.

 //ERRONEOUS CODE
$stateProvider
    .state('home', {
        url: '/home',
        templateUrl: '/home',
        controller: 'HomeCtrl',
        resolve: {
            authenticated: function($q, $location, $auth) {
                var deferred = $q.defer();

            if (!$auth.isAuthenticated()) {
                $location.path('/signIn');
                //FAILS to resolve or reject promise
            } else {
                deferred.resolve();
            }

            return deferred.promise;
        }
    }
})
  

Вместо этого возвращает отклонение при отсутствии аутентификации:

 $stateProvider
    .state('home', {
        url: '/home',
        templateUrl: '/home',
        controller: 'HomeCtrl',
        resolve: {
            authenticated: function($q, $location, $auth) {
                //var deferred = $q.defer();

                if ($auth.isAuthenticated()) {
                    return $q.resolve("AUTHENTICATED");
                };

                //otherwise
                return $q.reject("NOT AUTHENTICATED");
            })
        }
})
  

Когда функция распознавания возвращает отклоненное обещание, изменение состояния будет предотвращено и $stateChangeError событие будет транслироваться дальше $rootScope .