1

我有一个 AngularJS 应用程序,并且对于 $http 完成的每个请求都需要一个 ajax 加载器 - 有没有一种简单的方法可以做到这一点。

我现在的解决方案是每次调用 $http 时设置 $rootScope.loading = 1,成功时设置 $rootScope.loading = 0..

什么是“最佳实践”?

我的代码现在看起来像:

$rootScope.loading = 1;
$http({method : "POST", url:url, data: utils.params(data), headers: {'Content-Type': 'application/x-www-form-urlencoded'}}).success(function() {
    $rootScope.loading = 0;
});
4

2 回答 2

9

在这种情况下使用拦截器会更好 任何时候我们想要为所有请求提供全局功能,例如身份验证、错误处理等,能够提供在所有请求传递到之前拦截所有请求的能力是很有用的服务器并从服务器返回。

angular.module('myApp')
.factory('myInterceptor',
function ($q,$rootScope) {
    var interceptor = {
        'request': function (config) {
         $rootScope.loading = 1;
        // Successful request method
            return config; // or $q.when(config);
        },
        'response': function (response) {
         $rootScope.loading = 0;
        // successful response
            return response; // or $q.when(config);
        },
        'requestError': function (rejection) {
            // an error happened on the request
            // if we can recover from the error
            // we can return a new request
            // or promise
            return response; // or new promise
                // Otherwise, we can reject the next
                // by returning a rejection
                // return $q.reject(rejection);
        },
        'responseError': function (rejection) {
            // an error happened on the request
            // if we can recover from the error
            // we can return a new response
            // or promise
            return rejection; // or new promise
                // Otherwise, we can reject the next
                // by returning a rejection
                // return $q.reject(rejection);
        }
    };
    return interceptor;
});

并将其注册到配置中

angular.module('myApp')
  .config(function($httpProvider) {
   $httpProvider.interceptors.push('myInterceptor');
});

来自ng-book 的示例

于 2014-09-01T12:01:52.460 回答
1

使用 http拦截器来拦截您的所有$http请求\响应并在其中执行逻辑。

是创建自定义的示例。
这是一个准备好的模块的例子。

于 2014-09-01T11:26:59.373 回答