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