如果我在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
})
});
但是
这里我想要的是添加一个名为myDataService层的新层,这将有助于以这样的简单方式定义get,put,post,delete方法,
注意:(这里我只提供概念。我不知道它的真实实现。
我不知道我应该在这里使用.factory .service或javascript简单功能。但是,假设我使用的工厂如下
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
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调用。这只是一个要实现的概念。我想开发这样的架构。但无法找到答案。
答案 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'的服务就足够了。