Angular Controller可以很好地注入服务但是$ injector.get可以吗?

时间:2017-04-14 13:00:23

标签: angularjs

我有一个极端边缘的情况,我有一个我必须在配置期间定义的回调方法。这意味着没有范围,没有工厂等......我的工作是使用根注入器($ injector)并在运行时获取我的其他模块。

然而,当我在回调中调用$ injector.get(' myServiceName')时(在应用程序运行之后),我得到了#34;未知提供商"。在我的代码行运行之前,相同的服务没有问题(实际上是)。如果我调用$ injector.get(" myServiceNameProvider")那么我可以在我的回调中恢复提供者..但是另一个只有工厂的服务我根本无法获得。

因此,在这种极其糟糕的做法中,我如何能够阻止我配置的服务。哎,我甚至无法获得$ rootScope ..

2 个答案:

答案 0 :(得分:0)

首先是Angular inits提供者,然后是工厂/服务 - app.config中没有提供服务。

你可以像这样:

app.config(...
  window.on('scroll', function() { 
    // this is executed later
    $injector.get()...
  })

或者使用可用服务的app.run

答案 1 :(得分:0)

我想我几个月前遇到过类似的问题......我需要构建面包屑,但必须在config阶段(ui-router)创建。我这样做了(breadcrumbs-generation-service.provider.js):

 var somethingYouHaveToHaveLater = undefined;
 function BreadcrumbsGenerationService () {
    this.createStateData = createStateData;

    function createStateData (arg) {
        somethingYouHaveToHaveLater = arg;
    };
}

function BreadcrumbsGenerationServiceProvider () {
    this.$get = function BreadcrumbsGenerationServiceFactory () {
       return new BreadcrumbsGenerationService();
    }
}

angular
    .module('ncAdminApp')
    .provider('BreadcrumbsGenerationService', BreadcrumbsGenerationServiceProvider);

因为在Angular配置中使用了服务,所以需要注入提供程序以在配置阶段提供:Similar SO Question。尽管事实是注册为BreadcrumbsGenerationService需要注入BreadcrumbsGenerationServiceProviderconfig阶段,并与$get()一起使用:

BreadcrumbsGenerationServiceProvider.$get().createStateData(someParams);

但是在控制器中,不使用Provider后缀(BreadcrumbsGenerationServic)注入它,它就像普通服务一样。