【问题标题】:Angular Controller can inject service just fine but $injector.get can't?Angular Controller 可以很好地注入服务,但 $injector.get 不能?
【发布时间】:2017-09-10 17:51:39
【问题描述】:

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

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

因此,在这种极其糟糕的做法中,我该如何阻止我配置的服务。哎呀,我什至似乎都无法获得 $rootScope ..

【问题讨论】:

  • 只是尝试调用相同的结果 :-( $injector.invoke(['myServiceName', function (myServiceVar) {}]); Dagnabit..

标签: angularjs


【解决方案1】:

我想几个月前我遇到了类似的问题......我需要构建面包屑,但它们必须在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),它的行为就像正常的服务。

【讨论】:

  • 但你会认为如果我在回调中调用 $injector.get('myService') (在配置完成之后),它将能够解决服务..
  • @JoshHandel 是的,因为注入与从注入器中获取相同 - 但只需尝试我的答案,您就会发现:)
  • 所以我认为我们的问题有点不同。我正在使用 adal,它在引导程序的配置部分进行配置。在 adal 中它复制配置(不是通过引用: -(... ) 所以我交给它的回调我以后不能分配......在那个回调中做我需要做的事情我需要 $scope (真的我需要一些其他服务).. 如果我可以稍后分配一些东西..我也通过实验了解到 app.config 中的 $injector 与传递给控制器​​的 $injector 不同......所以 Angular 管理多个 $injector :-|
  • 我只是想修改 angular 模块 (adal-angular),以便可以在 app.run 期间设置我尝试使用的回调 (displayCall) 而不是这个鸡/蛋问题..我讨厌不得不偏离我不拥有的包,但我想如果它有效,我会提交一个拉取请求.. 愚蠢的阿达尔家伙..
  • @JoshHandel toy 可以为 Plunker 提供您的问题吗?这将有助于理解这种奇怪的行为。
【解决方案2】:

Angular 首先初始化提供者,然后是工厂/服务 - app.config 中不提供服务。

你可以这样处理:

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

或者在有服务的地方使用app.run

【讨论】:

  • 是的,这正是我在做的事情,服务仍然找不到...而且我没有选择将我的呼叫转移到 app.run... 我必须通过回调作为 .config 中另一个服务的配置... Angular 服务中有一个架构缺陷,它在配置中接受回调,但这就是我必须使用的:-(... \
猜你喜欢
  • 2022-06-30
  • 2013-08-12
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多