第一次注射不会实例化

时间:2014-05-07 06:52:00

标签: angularjs angularjs-factory

首次调用时,authenticated属性为false,即使凭据正常。如果我使用相同的凭证再次登录,则可以。

无论如何,我不确定我的工厂是否在angularjs中是正确的方式。你能给我任何建议吗?

厂:

app.factory('authenticatorService',['$resource', function($resource){
    var authenticator = {};

    authenticator.attempt = function(email, password){
        var current = this;
        $resource("/service/authentication/:id",null,{'update' : { method: 'PUT'}})
            .save({'email' : email,'password': password},
                //success
                function(response){
                    current.authenticated = sessionStorage.authenticated = true;
                    current.userinfo = response.user;
                    current.authenticated = true;
                },
                function(response){
                    current.authenticated = false;
                }
            );
        return  this.authenticated;
    };
    authenticator.logout = function(){
        delete sessionStorage.authenticated;
        this.authenticated = false;
        this.userinfo = null;
        return true;
    };
    authenticator.check = function(){
        if(this.userinfo && this.authenticated){
            return true;
        }
        return false;
    };

    return authenticator;

}]);

控制器:

app.controller('authenCtrl',
[
'authenticatorService',
'$scope',
'$sanitize',
'$log',
'$location',
function(alert, authenticator, $scope, $sanitize, $log, $location){

    $scope.login = function(){

        if(authenticator.attempt($sanitize($scope.email) ,$sanitize($scope.password))){
            $location.path('/dashboard');
        }else{
            alert.add("danger","Login fail.");
        }
    }
}]);

1 个答案:

答案 0 :(得分:1)

this.authenticated中的authenticator.attempt将在$resource的异步调用完成之前返回。

在从工厂返回之前以及在控制器中接收之前,您需要等待承诺得到解决。

这样的事情应该有用:

厂:

authenticator.attempt = function(email, password){

  var current = this;

  $resource("/service/authentication/:id", null, {'update' : { method: 'PUT'}})
    .save({'email' : email,'password': password},
      function(response){
          current.authenticated = sessionStorage.authenticated = true;
          current.userinfo = response.user;
          current.authenticated = true;
      },
      function(response){
          current.authenticated = false;
      }
    ).$promise.then(function () {
      return current.authenticated;
    });
};

控制器:

$scope.login = function() {

  var email = $sanitize($scope.email);
  var password = $sanitize($scope.password);

  authenticator.attempt(email, password).then(function(isAuthenticated) {

    if (isAuthenticated) $location.path('/dashboard');
    else alert.add("danger", "Login fail.");

  });
};