在我们的应用程序中,我们正在进行跨域请求,因此我们必须使用CORS。由于IE以非标准方式执行此操作,因此我们创建了自己的服务(对于非IE请求具有$http
依赖性),这将为我们处理所有这些。这一切都适用于这个应用程序。但是,我们有一些非特定于应用程序的库代码需要发出请求。因此,如果我们的库代码中的这些服务只使用$http
,则请求将无法在需要执行CORS的应用程序中运行。但是,我们不希望这些服务注入我们的CORS服务,因为这会破坏未执行跨域请求的应用程序中的请求。
尽管如此,我的最终目标是让库代码注入并使用$http
来完成所有必要的请求。然后,在特定应用中,它可以定义$http
的工作方式。我最初认为我可以重新定义$http
的提供者。像这样:
angular.module("myCorsApp").provider("$http", function() {
return {
$get: function(CORShttpService) {
return CORShttpService;
}
}
});
但是,这会导致以下错误:
Circular dependency: CORShttpService <- $http <- $compile
我不确定我是否了解循环依赖的来源。 $compile
是否依赖提供者或其他东西?
我真正的问题是,我是否以正确的方式解决这个问题。如果没有循环依赖,我认为这将完全符合我的要求。我可以采取哪些解决方法来完成这项工作吗?有没有更好/更正确的方法呢?
如果它有帮助,CORShttpService
具有以下依赖项:$ q,$ rootScope,$ http,$ timeout。谢谢你的帮助。
答案 0 :(得分:1)
在Angular文档中挖掘了一堆后,我认为这里最好的方法是“装饰”$http
服务。这是使用$provide
服务的decorator function完成的。所以,我最终得到了这样的东西:
angular.module("myCorsApp").config(function($provide) {
$provide.decorator("$http", ["$delegate", "$q", "$rootScope", "$timeout", function($http, $q, $rootScope, $timeout) {
return function(requestConfig) {
//CORS logic using $http (basically what was the CORShttpService)
}
}]);
});