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/
接下来,从我可以理解,你想检索$ 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
>从angular.js外部调用angular.element([DOM element])。injector()其中[DOM element]是定义ng-app的圆顶元素(或该元素的任何子元素)。更多信息:http://docs.angularjs.org/api/angular.element
这里是jsFiddle显示注射器检索的2种方法:http://jsfiddle.net/xaQzb/
还请注意,直接使用$ injector不是非常常见的单元测试之外的情况。从AngularJS世界之外检索AngularJS服务可能是有用的。更多信息:Call Angular JS from legacy code。