2014-09-01 53 views
1

我有一個AngularJS應用程序,並且需要一個ajax加載器來完成$ http所做的每個請求 - 是否有一種簡單的方法可以做到這一點。

我的解決方案現在是設置$ rootScope.loading = 1次,每次我叫$ HTTP,並設置$ 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; 
}); 

回答

9

在這種情況下,將更好地使用我們要對我們的所有要求,如認證, 錯誤處理等提供全球功能interceptor 任何時候,它是有用的,以便能夠提供攔截的能力所有請求都在 之前傳遞給服務器並從服務器返回。

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'); 
}); 

例如從納克書

1

使用HTTP interceptor爲了攔截所有$http請求\反應和對其執行邏輯。

Here's創建自定義窗口的示例。
Here's準備好模塊的示例。