我熟悉Jquery AJAX call,它有不同的回调,如beforeSend,success,complete等。
这是使用Jquery的示例AJAX调用:
$.ajax({
url: 'register.php',
type: 'POST',
data: {name:name, email:email},
beforeSend: function() {
// show loading GIF
},
complete: function() {
// hide loading GIF
},
success: function(data) {
// parse response
}
});
我想使用AngularJS实现相同目的。
AngularJS AJAX请求是否有 beforeSend 之类的回调? 这是我的代码到目前为止,但我不知道在哪里可以使用像 beforeSend 这样的回调(这样我可以在我的代码中显示加载的GIF图像):
$http.post('register.php', {'name': $scope.name, 'email': $scope.email})
.success(function(data, status, headers, config) {
if (data != '') {
}
});
答案 0 :(得分:11)
默认情况下,Angular不提供beforeSend和complete,但您可以使用拦截器来实现它们。这是我的实施:
(function() {
var app = angular.module("app");
app.factory("interceptors", [function() {
return {
// if beforeSend is defined call it
'request': function(request) {
if (request.beforeSend)
request.beforeSend();
return request;
},
// if complete is defined call it
'response': function(response) {
if (response.config.complete)
response.config.complete(response);
return response;
}
};
}]);
})();
然后你必须像这样注册你的拦截器:
(function () {
var app = angular.module('app', ['ngRoute']);
app.config(["$routeProvider", "$httpProvider", function ($router, $httpProvider) {
// Register interceptors service
$httpProvider.interceptors.push('interceptors');
$router.when("/", { templateUrl: "views/index.html" })
.otherwise({ redirectTo: "/" });
}]);
})();
在此代码之后,您可以像这样使用它:
var promise = $http({
method: 'POST',
url: constants.server + '/emails/send',
data: model,
beforeSend: function() {
model.waiting = true;
},
complete: function() {
model.waiting = false;
}
});
答案 1 :(得分:7)
您可以使用interceptors
。在Angular $http documentation
interceptor
正如文档所述:出于全局错误处理,>身份验证或任何类型的同步或异步预处理>请求或后处理响应
修改强>
正如Satpal评论的那样,小提琴中使用的$httpProvider.responseInterceptors
是deprecated
。您应该使用$httpProvider.interceptors
代替。