我试图在每次启动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调用时获取事件,而不必在每次调用时都传递配置对象?
提前致谢
您总是可以将$ 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'); }; });