一尘不染

AngularJS:每次启动ajax调用时都需要触发事件

angularjs

我试图在每次启动Ajax调用时在$ rootScope上触发一个事件。

var App = angular.module('MyApp');

App.config(function ($httpProvider) {
    //add a transformRequest to preprocess request
    $httpProvider.defaults.transformRequest.push(function () {
        //resolving $rootScope manually since it's not possible to resolve instances in config blocks
        var $rootScope = angular.injector(['ng']).get('$rootScope');
        $rootScope.$broadcast('httpCallStarted');

       var $log = angular.injector(['ng']).get('$log');
       $log.log('httpCallStarted');
    });
});

事件“ httpCallStarted”没有被触发。我怀疑在配置块中使用$
rootScope或任何其他实例服务是不正确的。如果是这样,如何在每次启动HTTP调用时获取事件,而不必在每次调用时都传递配置对象?

提前致谢


阅读 227

收藏
2020-07-04

共1个答案

一尘不染

您总是可以将$
http包装在服务中。由于服务仅设置一次,因此您可以让服务工厂为您设置事件。老实说,这对我来说有点骇人听闻,但这是一个不错的解决方法,因为Angular尚无全局方法来执行此操作,除非在1.0.3中添加了我不知道的内容。

这是一个工作的家伙

这是代码:

app.factory('httpPreConfig', ['$http', '$rootScope', function($http, $rootScope) {
    $http.defaults.transformRequest.push(function (data) {
        $rootScope.$broadcast('httpCallStarted');
        return data;
    });
    $http.defaults.transformResponse.push(function(data){ 
        $rootScope.$broadcast('httpCallStopped');
        return data;
    })
    return $http;
}]);

app.controller('MainCtrl', function($scope, httpPreConfig) {
  $scope.status = [];

  $scope.$on('httpCallStarted', function(e) {
    $scope.status.push('started');
  });
  $scope.$on('httpCallStopped', function(e) {
    $scope.status.push('stopped');
  });

  $scope.sendGet = function (){ 
    httpPreConfig.get('test.json');    
  };
});
2020-07-04