在Angularjs中发送的jQuery ajax相当于什么?

sha*_*nth 15 ajax jquery angularjs angularjs-http

我熟悉Jquery AJAX调用,它有不同的回调,如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
  }
});
Run Code Online (Sandbox Code Playgroud)

我希望使用AngularJS实现相同的目标.

对于AngularJS AJAX请求,是否有像beforeSend之类的回调?这是我的代码到目前为止,但我不知道我在哪里可以使用像beforeSend之类的回调(以便我可以在我的代码中显示加载的GIF图像):

$http.post('register.php', {'name': $scope.name, 'email': $scope.email})
.success(function(data, status, headers, config) {
    if (data != '') { 
    }
});
Run Code Online (Sandbox Code Playgroud)

Ro.*_*Ro. 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;
            }
        };

    }]);

})();
Run Code Online (Sandbox Code Playgroud)

然后你必须像这样注册你的拦截器:

    (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: "/" });        
        }]);
    })();
Run Code Online (Sandbox Code Playgroud)

在此代码之后,您可以像这样使用它:

var promise = $http({
    method: 'POST',
    url: constants.server + '/emails/send',
    data: model,
    beforeSend: function() {
        model.waiting = true;
    },
    complete: function() {
        model.waiting = false;
    }
});
Run Code Online (Sandbox Code Playgroud)


Mer*_*lin 7

你可以用interceptors.interceptor在Angular $ http文档中搜索单词

正如文档所述:出于全局错误处理,>身份验证或任何类型的同步或异步预处理>请求或后处理响应

这是一个很好的小提琴示例,在发送ajax调用之前显示加载gif.

编辑

正如Satpal评论的那样,$httpProvider.responseInterceptors在小提琴中使用的是deprecated.你应该使用$httpProvider.interceptors.

  • `$ httpProvider.responseInterceptors`已弃用.你应该提供`$ httpProvider.interceptors`的例子 (2认同)