Angularjs资源处理响应&自定义方法

时间:2013-11-01 17:40:22

标签: angularjs resources

是否可以在AuthService中处理响应并使用SessionService设置会话?

我现在在控制器中使用成功回调来完成它,但我仍然是Angularjs的新手,并试图了解如何自定义资源。

我正在使用Angularjs 1.1.5

app.factory('AuthService', ['$resource', 'SessionService',
function($resource, SessionService) {

    return $resource(
        '/api/v1/auth/:action',
        {action:'@action'},
        {
            login: {
                method:'POST',
                params: {
                    action: 'login'
                }
            },
            logout: {
                method:'GET',
                params: {
                    action: 'logout'
                }
            }
        }
    );
}
]);

app.controller('LoginCtrl', ['$scope', '$location', 'AuthService', 'SessionService' function LoginCtrl($scope, $location, AuthService, SessionService) {

$scope.credentials = { email: "", password: ""};

$scope.login = function() {
    AuthService.login($scope.credentials).success(function() {
        SessionService.set('authenticated', true);
        $location.path('/home');
    });
}
}]);

app.factory("SessionService", function() {
 return {
  get: function(key) {
   return sessionStorage.getItem(key);
  },
  set: function(key, val) {
   return sessionStorage.setItem(key, val);
  },
  unset: function(key) {
   return sessionStorage.removeItem(key);
  }
 }
});

2 个答案:

答案 0 :(得分:1)

我不确定$ resource是否适合在这里使用。我认为使用普通的$ http实现AuthService会简单得多。只需实现登录和注销作为正常功能,然后您可以随心所欲地做任何你想做的事情。您还应确保返回承诺,即如果他们在登录后需要执行其他操作,则无论是调用login()还是logout(),仍然可以对其执行.then()。这是一个例子:

app.factory('AuthService', ['$http', '$location' 'SessionService',
function($http, $location, SessionService) {
     var baseUrl = '/api/v1/auth/';

     function onLoginSuccess(data){
            SessionService.set('authenticated', true);
            $location.path('/home');
     }

     function onLoginFailure(error){
       SessionService.unset('authenticated');
       $location.path('/login');
     }


    return {
      login: function(credentials){
          return $http.post(baseUrl+'login', credential).then(onLoginSuccess, onLoginFailure);
      }

      logout: function(){
          return $http.get(baseUrl+'logout');
      }
    };

app.controller('LoginCtrl', ['$scope', 'AuthService', function LoginCtrl($scope, AuthService) {
    $scope.credentials = { email: "", password: ""};
    $scope.login = function() {
        AuthService.login($scope.credentials);      
    }
}]);

app.factory("SessionService", function() {
 return {
  get: function(key) {
   return sessionStorage.getItem(key);
  },
  set: function(key, val) {
   return sessionStorage.setItem(key, val);
  },
  unset: function(key) {
   return sessionStorage.removeItem(key);
  }
 }
});

答案 1 :(得分:0)

路径/ api / v1 / auth / login上的服务器端脚本应该返回一个结果,表明登录已成功授予。

例如,如果授予了登录权限,则/api/v1/auth/login会返回成功回复200。 如果登录被拒绝,则/api/v1/auth/login将返回错误的请求响应(失败)400

如果出现这种情况,您的代码应按照以下方式编写,

app.controller('LoginCtrl', ['$scope', '$location', 'AuthService', 'SessionService'
function LoginCtrl($scope, $location, AuthService, SessionService) {
    $scope.credentials = { email: "", password: ""};
    $scope.login = function() {
    AuthService.login($scope.credentials, function(data) { //Success callback
        SessionService.set('authenticated', true);
        $location.path('/home');
    }, function(error){ //Failure callback
        SessionService.unset('authenticated');
        $location.path('/login');
    });
}
}]);