Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 将$http.post调用移动到服务中_Angularjs - Fatal编程技术网

Angularjs 将$http.post调用移动到服务中

Angularjs 将$http.post调用移动到服务中,angularjs,Angularjs,我是新来的AngularJS不笨,哈哈。我在一个控制器中接到这个电话,我想把它转到一个服务。我需要使它可用于多个控制器 $http.post("/admin/Leads/LoadLeads.ashx", dataObj) .success(function (response) { $scope.Leads = response.p; }); 这是我试过的。获取响应不能以相同的方式分配数据 服务: myLeadDashboard.factory('LeadsS

我是新来的AngularJS不笨,哈哈。我在一个控制器中接到这个电话,我想把它转到一个服务。我需要使它可用于多个控制器

 $http.post("/admin/Leads/LoadLeads.ashx", dataObj)
    .success(function (response) {
        $scope.Leads = response.p;
    });
这是我试过的。获取响应不能以相同的方式分配数据

服务:

myLeadDashboard.factory('LeadsServiceTest',[function(){
            return {
                retrievePostData: function($http,dataObj){
                    return $http.post("/admin/Leads/LoadLeads.ashx", dataObj);
                    }
            }
        }]);
 var LeadsPromise = LeadsServiceTest.retrievePostData($http,dataObj);
            LeadsPromise.then(function(data) {
                $scope.Leads = data.p;
            });
控制器:

myLeadDashboard.factory('LeadsServiceTest',[function(){
            return {
                retrievePostData: function($http,dataObj){
                    return $http.post("/admin/Leads/LoadLeads.ashx", dataObj);
                    }
            }
        }]);
 var LeadsPromise = LeadsServiceTest.retrievePostData($http,dataObj);
            LeadsPromise.then(function(data) {
                $scope.Leads = data.p;
            });

我做错了什么?我不明白什么?如果你需要更多关于我正在做什么的信息,请让我知道。谢谢。

以下是我如何使用角度服务-

.service('mySpecialService', [
        '$q',
        'Restangular',
        function MyService($q, Restangular) {


            MyService.prototype.list = function() {
                return $q(function(resolve, reject) {
                    //make list call
                });
            };

            MyService.prototype.post = function(data) {
                return $q(function(resolve, reject) {
                   //make post call
                });
            };

            MyService.prototype.delete = function(id) {

                return $q(function(resolve, reject) {
                    //delete by id
                });
            };

            MyService.prototype.list = function list() {

                return $q(function(resolve, reject) {
                   //make list call
                });
            };
因此,我喜欢使用
$q
,也可以使用
restangular
代替
$http
——但是如果您喜欢的话,
$http
也可以。然后,您将服务注入到任何您想要使用它并调用它的地方

所以就像-在一个控制器中,你把它注入,它可能是

 MyService.post(postData);
因为我使用
$q
,你可以选择使用如下承诺

  MyService.post(postData)
      .then(function(data){
        //call complete logic
      })
      .catch(function(err){
          console.log("error in post ", err);
      });  

请注意-如果您不使用
$q
,您将有一个
.data
层。

HttpPromise.suces扩展响应对象,以便第一个参数是数据…$q。然后为您提供原始响应对象。您可以通过以下方式从控制器访问数据:

 var LeadsPromise = LeadsServiceTest.retrievePostData($http,dataObj);
 LeadsPromise.then(function(response) {
   $scope.Leads = response.data.p;
 });

声明服务时,必须将$http服务作为服务函数的参数。然后,$http服务返回承诺

当您使用.then()时,它会返回一个承诺,而.success()是注册回调的更传统的方法,不返回承诺

PS:一个好的提示是包装您的服务/控制器/等。。声明转换为匿名函数

您可以执行以下操作:

控制器

(function(){

function Controller($scope, Service) {

  //Retrieve our promise
  var promise = Service.post([1,2,3]);

  promise.then(function(response){
    //Retrieve our data
    console.log(response.data);
  });

  promise.success(function(data){
    //Data is what i want, it is not raw data
    console.log(data)
  });

}

angular
.module('app', [])
.controller('ctrl', Controller);

})();
服务

(function(){

  function Service($http){


    function post(data){
      //Return promise
      return $http.post('path_to_url', data);
    }

    var factory = {
      post: post
    };

    return factory;

  }

  angular
    .module('app')
    .factory('Service', Service);

})();

$q属性是唯一用于错误处理的吗?我的API处理了其中的大部分。当它到达我的前端代码时,它只需要在适当的地方渲染。并公开对我的API的调用,以适当地更新数据库。角度看起来是一个很好的方法。学习曲线是一个轻微的重量,但不是纯粹的不,这是一个承诺图书馆,将只是捕捉到如果有任何错误,你现在很好地习惯了这一点
$http
不推荐使用成功/错误处理程序:$q继承$http吗?从OOP标准来看,$http函数返回一个自定义的$q承诺,该承诺提供了额外的成功/错误函数……因为它们不推荐它们,所以您应该坚持使用$http调用的结果作为标准的$q承诺。如果希望服务函数返回实际数据,可以使用承诺链接:
return$http.post(…).then(function(response){return response.data;})