重新定义内置角度服务的最佳/最简单方法是什么?

时间:2013-04-09 18:26:33

标签: angularjs cors

在我们的应用程序中,我们正在进行跨域请求,因此我们必须使用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。谢谢你的帮助。

1 个答案:

答案 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)
        }
    }]);
});