0

我无法使用服务对外部 API 进行身份验证,并在同一表单提交中注册更新的服务数据。我相当确定这是一个范围问题,但我对 Angular 还是很陌生,并且不确定如何在控制器中正确地确定范围。

我定义了以下身份验证服务:

angular.module('myapp.services', []).
  factory('AuthService', ['$http', function($http){
    var currentUser;
    var isLoggedIn = false;

    return {
      login: function(user, pass) {
        $http({method: 'GET', url:'https://some-api/api/login/'+user+'/'+pass}).
          success(function(data){
            currentUser = data;
            isLoggedIn = true;
          });
      },
      isLoggedIn: function(){ return isLoggedIn; },
      currentUser: function(){ return currentUser; }
    };
  }]);

然后我在绑定到“用户”的视图中有一个基本表单,然后在我的控制器中:

angular.module('myapp.controllers', [])
  .controller('LoginCtrl', ['$scope', 'AuthService', function(scope, AuthService) {
    scope.update = function(user){
      AuthService.login(user.username, user.password);
      console.log(AuthService.currentUser());
    };
  }]);

在第一次提交时,我在控制台中得到“未定义”,在第二次提交时,我在控制台中看到了预期的数据......我一直在阅读有关返回承诺之类的内容,只是对给出的精确实现有点不清楚我的代码结构...

4

1 回答 1

1

看起来您正在尝试在 xhr 请求完成之前记录用户。尝试这个:

angular.module('myapp.services', []).
factory('AuthService', ['$q', '$http', function($q, $http){
  var currentUser;
  var isLoggedIn = false;

  return {
    login: function(user, pass) {
      var deferred = $q.defer();
      $http({method: 'GET', url:'https://some-api/api/login/'+user+'/'+pass}).
        success(function(data){
          currentUser = data;
          isLoggedIn = true;
          deferred.resolve();
        });
      return deferred.promise;
    },
    isLoggedIn: function(){ return isLoggedIn; },
    currentUser: function(){ return currentUser; }
  };
}]);

接着

angular.module('myapp.controllers', [])
.controller('LoginCtrl', ['$scope', 'AuthService', function(scope, AuthService) {
  scope.update = function(user){
    AuthService.login(user.username, user.password).then(function() {
      console.log(AuthService.currentUser());
    });

  };
}]);
于 2013-07-22T18:27:45.447 回答