如何在angularjs中为$ http调用创建新的DataService层

时间:2015-04-16 13:18:12

标签: angularjs

如果我在angularjs中使用$ http调用,那么我会像下面一样使用它,

app.factory('myDataService', function($http){

return{
  getProducts:function()
  {
     return $http.get('api/Product');
  }
}

});

并在像这样的控制器中使用它,

app.controller('appCtrl',function($scope,myDataService){

          //Get Products
          myDataService.getProducts().success(function(data,status){
                      //some stuff
          }).error(function(data,status){
                       //some stuff
          })

});

这是一种调用web api的简单方法......


但是

这里我想要的是添加一个名为myDataService层的新层,这将有助于以这样的简单方式定义get,put,post,delete方法,

注意:(这里我只提供概念。我不知道它的真实实现。

我不知道我应该在这里使用.factory .service或javascript简单功能。但是,假设我使用的工厂如下

myDataService

app.factory("myDataService", function (myHttPLayer)  //myHTTPLayer is injected
    { 
        //below code is not correct (I want to connect it to myHTTPLayer somehow)
         return{
            var myVar={
                          get:{
                              products:'/api/Product',
                              companies:'/api/Companies'
                              },
                          post:{
                                product:'/api/Product',
                                company:'/api/Companies'
                               }
                          }
                }    
    });

这里我想要的是引入这样的新图层,它只提供有关get,put,post方法和api调用的信息....

我不想在角度控制器中每次都写$ http.get,$ http.post。我想只在一个地方写一次。像这样,

... some.js

myHTTPLayer

app.factory('myHttPLayer',function($http){
return {
       get:function()
         { return $http.get(url);},

       post:function(obj)
         { return $http.post(url,obj)

}
});

我想连接两个工厂并使用它们或在角度控制器端编写它们,我想进行web api调用。

注意:这只是一个概念。

请帮帮我....

在我看来,我想要实现的是,

在角度控制器中,比如,

app.controller("appCtrl",function($scope,myDataService){

     //Connect myDataService to myHTTPLayer internally so I can use them as below....

    //I want my api to be called when i write myDataService.getProducts() shown as below ....


      myDataService.getProducts().success(function(){})
                                 .error(function(){});
})

一个重要提示:编辑

不要考虑myDataSevice的单行代码。这是完全错误的。考虑一下,我在一个工厂中拥有所有可用的http方法,并且具有适当的原型,可以在myHTTPLayer中返回承诺。一旦写得正确,我就不会发脾气。我想要做的是编写myDataService代码,这样我就可以在角度控制器中使用它,而无需在控制器中使用myHTTP层。当我在控制器中使用myDataService时,它必须在场景后面使用httplayer,它必须对定义的web api进行角度http调用。这只是一个要实现的概念。我想开发这样的架构。但无法找到答案。

2 个答案:

答案 0 :(得分:1)

我通常这样做,希望这可以帮助你

app.factory('myDataService',function($http){
return {
   getProducts:function(variable, callback) // this variable can be products or companies
     {
        if(variable == null){
         return $http.get(url).success(callback).error(callback);
   }else if(variable == products){
         return $http.get(url+'/api/Product').success(callback).error(callback);
    }else if(variable == companies){
         return $http.get(url+'/api/Companies').success(callback).error(callback);
    }
}

});

在COntroller中,它看起来像这样

$scope.test = myHttPLayer.get(products).onsuccess(function(){
                     Do Something ....
         });

答案 1 :(得分:1)

@ stackg91发布了一个很好的答案,但我相信它可以进一步简化为else块。无论你的'变量'是什么('产品','公司'等),下面都会有效。

app.factory('myHttPLayer',function($http){
    return {

        get: function(variable) {
            if(variable == null){
                return $http.get(url);
            } else {
                return $http.get(url + '/api/' + variable);
            }
        }
    }
});

然后你可以简单地在你的控制器中调用myHTTPLayer.get(products)。我不相信你需要三层来获得你在这里寻找的功能。我认为控制器将参数传递给使用该参数进行'$ http calls'的服务就足够了。