AngularJS: понимание службы при использовании $ http.post

Я перемещаю все HTTP-вызовы в своих контроллерах в службы, используя $q для обещания ... Кажется, все работает, пока я не обновлю страницу, а затем содержимое исчезнет.

Настройка: в моей службе входа в систему у меня есть функция, которая выполняет $http.post, она принимает username и password. Затем данные ответа помещаются в обещание.

Проблема: хотя служба работает, она пытается повторно отправить http-вызов при обновлении страницы. Затем вызов не выполняется, поскольку отсутствуют данные для входа.

Вопрос: Как мне сохранить / сохранить исходные данные, чтобы при обновлении страницы (и пользователь все еще вошел в систему) и когда я использую службу в других контроллерах, это происходило не делать http-вызов, он просто возвращает данные?

Сервис:

var app = angular.module('myApp', ['ngRoute']);
app.factory('loginService', function($http, $q) {
    var deferResults = $q.defer();
     return {
    appContent: function(login_username, login_password) {
        $http.post('/login',{username: login_username, password: login_password}).success(function(data) {
          deferResults.resolve(myData);
      });
      return deferResults.promise;
    }
});

Контроллеры:

    function loginPageCtrl($scope, loginService) {
       $scope.login = function (login_username, login_password, login_rememberMe) {
          loginService.appContent(login_username, login_username).then(function (data) {
             $scope.pageOneContent = data;
          });
       };
    };

    function pageTwoCtrl($scope, loginService) {
      // Use the same data when page is refreshed
      // without having to pass-in login details

      loginService.appContent().then(function (data) {
         $scope.pageTwoContent = data;
      });
   };

person Simo D'lo Mafuxwana    schedule 17.03.2014    source источник


Ответы (1)


Конечно, это происходит, ваше приложение теряет все свое состояние при обновлении страницы. Вам нужно где-то сохранить это имя пользователя и пароль, например, в файле cookie, а затем получить его и выполнить второй вызов $http, а еще лучше просто сохранить токен в файле cookie и использовать его для аутентификации. Используйте angular $cookieStore, чтобы сохранить данные для входа:

var userData={username:login_username,password:login_password};
$cookieStore.put('user_data', userData);

а затем, когда контроллер загрузится, проверьте, существует ли cookie:

var userData = $cookieStore.get('user_data');
return userData

Проверьте источник в этот ответ, чтобы увидеть это в действии.

Напомним, каждый раз, когда контроллер загружается, проверяйте файл cookie, если он не определен, перенаправьте пользователя на страницу входа, если нет, извлеките токен / имя пользователя / пароль и сделайте свой вызов $http.

person Mohammad Sepahvand    schedule 17.03.2014
comment
Разве нельзя архивировать то же самое без использования файлов cookie? Я пытаюсь не помещать сырые пароли в куки - person Simo D'lo Mafuxwana; 17.03.2014
comment
Проверьте ссылку, которую я предоставил, в этом ответе есть довольно хорошая реализация аутентификации. Да, и вы никогда не должны хранить пароли на стороне клиента, вы храните токен, возвращаемый сервером, в cookie. - person Mohammad Sepahvand; 17.03.2014