我有两个模块的应用程序:
angular.module('components', []).directive('foo', function () { return {};}); angular.module('gaad', ['components']);
有很多与此模块相关的指令,在此不包括在内。该应用程序运行正常。但是,当我尝试检索模块的注入器时gaad:
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/
在回答问题之前,我们需要注意, 每个应用程序只有一个注入器实例,而每个模块只有一个 。从这个意义上说,不可能为每个模块取回注射器。当然,如果我们采用顶层模块,则它代表了整个应用程序。从这个意义上讲,应用程序和顶级模块似乎是等效的。看起来可能有细微的差别,但必须理解它才能完全正确地回答此问题。
接下来,从我能理解你想 获取 的$injector,而不是创建它的一个新的实例。问题是angular.injector它将$injector为指定为参数的模块(应用程序)创建一个新实例。在这里,必须明确指定主要的AngularJS模块(ng)。因此,在此代码示例中:
$injector
angular.injector
var injector = angular.injector(['gaad', 'components']);
您试图通过在“ gaad”和“ components”模块中定义的组件创建一个新的进样器,而显然$compileProvider没有在您的自定义模块中定义。 将ng模块添加到列表中将通过创建新的注射器来“解决”该问题 -您可能不想发生这种情况。
$compileProvider
ng
要实际检索与正在运行的应用程序关联的注射器实例, 我们可以使用2种方法:
angular.element([DOM element]).injector()
ng-app
这是jsFiddle,它显示了两种检索注射器的方法:http : //jsfiddle.net/xaQzb/
还请注意,$injector在单元测试之外,直接使用并不是很常见的情况。从AngularJS世界之外检索AngularJS服务可能是有用的想法。