Angular:为什么我不能把$提供直接注入$get ?

Angular: Why can't I inject $provide directly into $get?

本文关键字:注入 get 为什么 不能 Angular      更新时间:2023-09-26

我想这个问题有一个直接的(可能是微不足道的)答案,只是我还没有想清楚。

为什么这样做是我想要的——也就是说,将对$provide的引用注入到我的服务中:

angular.module('error_reporting', [])
       .provider('RaygunLogger', function() {
           var provide = undefined;
           this.setProvide = function(p){
                provide = p;
           }
           this.$get = function() {
               // use $provide in p
           };
       })
       .config(function(RaygunLoggerProvider, $provide) {
           RaygunLoggerProvider.setProvide($provide);
       });

,而这会产生一个错误的形式Unknown provider: $provideProvider <- $provide <- RaygunLogger <- RaygunLogger ?

angular.module('error_reporting', [])
       .provider('RaygunLogger', function() {
           this.$get = function($provide) {
                // use $provide
           };
       });

注射器设置前RaygunLogger.$get()是否运行?我认为这是一个操作顺序问题,在我可以注入$provide之前,我需要等到模块配置阶段,但我不知道在哪里验证文档。

$provide仅在配置阶段可用。提供程序的$get函数在配置阶段之后运行,以创建提供程序提供的东西。

在这一点上,你不能做你想做的。

要在$get中使用它,您通常使用

启动提供商函数
var self = this;

而在$get (factory)定义中使用self

angular.module('foo',[])
.provider('myFoo', function myFooProviderFn() {
    var self = this;
    self._debug = false;
    self.setDebug = function() { self._debug = true; }
    self.$get = ['$location', function($location) {
        self.setDebug();
    });
});

认为不能在$get中使用它是错误的。因此,实际的纯提供者实例只能在配置阶段被访问和操作。这种设计背后的基本原理可能是提供者被认为是配置工厂的某种机制。

更多来自文档(Provider recipe)