无法从角度检索进样器

Szy*_*ski 52 angularjs

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

angular.module('components', []).directive('foo', function () { return {};});
angular.module('gaad', ['components']);
Run Code Online (Sandbox Code Playgroud)

有一堆与这个模块相关的指令,我不在这里.该应用程序工作正常.但是当我试图检索模块的注入器时gaad:

var injector = angular.injector(['gaad', 'components']); //called after 'gaad' module initialization
Run Code Online (Sandbox Code Playgroud)

抛出错误:

Uncaught Error: Unknown provider: $compileProvider from components 
Run Code Online (Sandbox Code Playgroud)

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

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

pko*_*rce 120

在回答问题之前,我们需要注意每个应用程序只有一个注入器实例,而不是每个模块.从这个意义上说,不可能为每个模块检索一个注射器.当然,如果我们采用顶级模块,它代表整个应用程序.从这个意义上说,应用程序和顶级模块似乎是等价的.这似乎是一个微妙的差异,但重要的是要理解,以便充分和正确地回答这个问题.

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

var injector = angular.injector(['gaad', 'components']);
Run Code Online (Sandbox Code Playgroud)

您试图从"gaad"和"components"模块中定义的组件创建新的注入器,显然$compileProvider未在自定义模块中定义.ng模块添加到列表将通过创建新的注入器来"解决"问题 - 您可能不希望发生这种情况.

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

这是jsFiddle显示2种注入器检索方法:http://jsfiddle.net/xaQzb/

另请注意,$injector直接使用不是单元测试之外的常见情况.从AngularJS世界之外检索AngularJS服务可能是有用的.更多信息:从遗留代码中调用Angular JS.

  • 很高兴听到这个@maxisam!我通过回答这些问题了解了很多:-) (4认同)

Rya*_*ill 13

看来您还需要在进样器中包含ng.

var injector = angular.injector(['ng', 'b', 'a']);
Run Code Online (Sandbox Code Playgroud)

来自:AngularJS:注射器

必须明确添加ng模块.