小编rec*_*hak的帖子

在AngularJS中重写运行时的依赖项

我有一个名为的服务$doggedHttp,它公开了相同的接口$http.现在我想创建一个$doggedResource服务,它是角度$resource服务$doggedHttp而不是$http.在其他的话,我想注入$doggedHttp$http服务.

此外,在我的应用程序中,我希望能够创建$doggedResource$resource.因此,我不能简单地覆盖$http$doggedHttp.

我认为依赖注入应该使这个场景很容易解决.我错了吗 ?

相反,我不得不深入研究角度源代码,最终提出了一个非常难看的解决方案:

angular.module('doggedResource', ['ngResource', 'doggedHttp'])
  .config(function() {
    var ngResource = angular.module('ngResource'),
        doggedResource = angular.module('doggedResource');

    // replace the placeholder below with the $resource factory from ngResource
    doggedResource._invokeQueue[1][2][1][2] = ngResource._invokeQueue[0][2][1][2];
})
.factory('$doggedResource', ['$doggedHttp', '$parse', null /* this is just a placeholder */]);
Run Code Online (Sandbox Code Playgroud)

有更好的解决方案吗?


注意我们不能$provide.decorator用来替换注入的$http服务.为了说明这个问题,这里是angular-resource.js的相关部分:

angular.module('ngResource', ['ng']).
  factory('$resource', ['$http', '$parse', …
Run Code Online (Sandbox Code Playgroud)

javascript dependency-injection angularjs

5
推荐指数
1
解决办法
1963
查看次数