小编典典

无法从角度检索注射器

angularjs

我有两个模块的应用程序:

angular.module('components', []).directive('foo', function () { return {};});
angular.module('gaad', ['components']);

有很多与此模块相关的指令,在此不包括在内。该应用程序运行正常。但是,当我尝试检索模块的注入器时gaad

var injector = angular.injector(['gaad', 'components']); //called after 'gaad' module initialization

引发错误:

Uncaught Error: Unknown provider: $compileProvider from components

该应用程序现在很大,我不知道应该在哪里寻找错误。所以我的问题是: 我可能遇到问题的原因什么?

编辑: 我能够复制我的问题:http :
//jsfiddle.net/selbh/ehmnt/11/


阅读 291

收藏
2020-07-04

共1个答案

小编典典

在回答问题之前,我们需要注意, 每个应用程序只有一个注入器实例,而每个模块只有一个
。从这个意义上说,不可能为每个模块取回注射器。当然,如果我们采用顶层模块,则它代表了整个应用程序。从这个意义上讲,应用程序和顶级模块似乎是等效的。看起来可能有细微的差别,但必须理解它才能完全正确地回答此问题。

接下来,从我能理解你想 获取
$injector,而不是创建它的一个新的实例。问题是angular.injector它将$injector为指定为参数的模块(应用程序)创建一个新实例。在这里,必须明确指定主要的AngularJS模块(ng)。因此,在此代码示例中:

var injector = angular.injector(['gaad', 'components']);

您试图通过在“ gaad”和“
components”模块中定义的组件创建一个新的进样器,而显然$compileProvider没有在您的自定义模块中定义。
ng模块添加到列表中将通过创建新的注射器来“解决”该问题 -您可能不想发生这种情况。

要实际检索与正在运行的应用程序关联的注射器实例, 我们可以使用2种方法:

  • 在AngularJS JavaScript中,最简单的解决方案就是注入$injector实例:http : //docs.angularjs.org/api/angular.injector
  • 从AngularJS世界以外的国家/地区调用- angular.element([DOM element]).injector()其中[DOM元素]是ng-app定义了的圆顶元素(或该元素的任何子元素)。此处提供更多信息:http : //docs.angularjs.org/api/angular.element

这是jsFiddle,它显示了两种检索注射器的方法:http :
//jsfiddle.net/xaQzb/

还请注意,$injector在单元测试之外,直接使用并不是很常见的情况。从AngularJS世界之外检索AngularJS服务可能是有用的想法。

2020-07-04