Angular 1.5 - 将http post响应传递给控制器

时间:2017-09-22 04:14:03

标签: angularjs

我正在尝试从我的控制器向服务传递一个http响应,它运行良好除了让响应进入控制器这里是我的代码:

我的服务

app.factory('ApiService',function($http,Config,$q){

 return {
 	login: function(payload,callBack){
 		var deferred = $q.defer();
		$http({
	        method:'POST',
	        url:Config.baseUrl + '/api/login',
	        data:payload,
	        headers: {'Content-Type': 'application/json'},
	      }).then(function successCallback(callBack){
	      	 console.log(callBack);
	      	 return deferred.resolve(callBack);
	      }, function errorCallback(callBack){
	      	 //deferred.reject(error);
	      	 console.log(callBack);
	      	 return deferred.reject(callBack);
	      });
	      return deferred.promise;
      }
 }

});

和控制器

app.controller('LoginCtrl', function($scope,$position,$rootScope,$state,ApiService) {


    $scope.forms = {
      'loginForm':''
    }  

    var payload ={
      'username':'',
      'password':''
    }
  	
  	$scope.userLogin = function(form){

      $scope.username = form.username.$modelValue;
      $scope.password = form.password.$modelValue;

      payload ={
        "username":$scope.username,
        "password":$scope.password
      }

      ApiService.login(payload, function(result){
        console.log(result);
      }

      
  	

  });

现在我不明白,因为当我console.log()响应时,我能够在服务中看到它但在控制器上做同样的事情我什么都没得到。

2 个答案:

答案 0 :(得分:3)

无需使其复杂化。只需从factory返回承诺,并在controller.

中使用

工厂:

app.factory('ApiService',function($http,Config,$q) {    
   return {
        login: function(payload) {
            return $http({
                method:'POST',
                url:Config.baseUrl + '/api/login',
                data:payload,
                headers: {'Content-Type': 'application/json'},
              });
          }
        }
    });
控制器中的

 ApiService.login(payload).then(function(data){
      // use response data    
   }, function(error) {
      // handle error
 });

答案 1 :(得分:1)

您应该像这样使用它:

 ApiService.login(payload).then(function(result){
    console.log(result);
  });

因为您要在服务中退回承诺。 此外,您不需要该回调参数,因为承诺上的then方法是您完成后的回调,您可以访问您解决的数据。

app.factory('ApiService',function($http,Config,$q){

return {
login: function(payload){
    var deferred = $q.defer();
    $http({
        method:'POST',
        url:Config.baseUrl + '/api/login',
        data:payload,
        headers: {'Content-Type': 'application/json'},
      }).then(function (result){             
         return deferred.resolve(result);
      }, function (result){
         return deferred.reject(result);
      });
      return deferred.promise;
  }
 }
});