AngularJS:使用$ http.post时了解服务

时间:2014-03-17 09:55:48

标签: javascript angularjs angular-services

我正在将我的控制器中的所有http调用移动到服务,使用$q来承诺......一切似乎都有效,直到我刷新页面然后内容消失。

设置:在我的登录服务中,我有一个执行$http.post的功能,需要usernamepassword。然后将响应数据放入承诺中。

问题:虽然服务正常,但是在刷新页面时尝试重新发送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;
      });
   };

1 个答案:

答案 0 :(得分:2)

当然会发生这种情况,当您的网页刷新时,您的应用会失去所有状态。您需要在某个地方保留该用户名和密码,例如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

检查this answer中的来源以查看此操作。

总结一下,每次控制器加载检查cookie时,如果未定义,则将用户重定向到登录页面,如果不是,则提取toke / username /密码并进行$http调用。