从角度来看,似乎注册服务提供商和模块配置代码的顺序很重要:为了使配置代码能够找到提供者,提供者应该在之前注册。
这对我来说是一个惊喜,因为我认为angular首先处理所有提供者注册,使它们可用于DI,然后调用config回调,如下所示:
module.config(function(myServiceProvider){...});
请在这里看到一个非常简短的测试来证明这个问题。它在“未知提供者”上失败,您可以在JS控制台中看到它:http://plnkr.co/edit/jGJmE2Fq7wOrwubdlTTX
我在这里遗漏了什么?这是一种预期的角度行为吗?
感谢。
答案 0 :(得分:1)
在最新版本的Angular中看起来这种行为已经发生了变化(确切地说不确定)。我修改了你的Plunker从1.0.7到1.3.0,它没有像你原先预期的那样工作。
类似的代码示例: var myModule = angular.module(' myModule',[]);
myModule.config((myServiceProvider) => {
});
myModule.service('myService', () => {
});
在向模块注册提供程序之前为提供程序运行配置应该可以正常工作。
<强>参考强>
作为参考,此报告的问题似乎是修复它的问题:https://github.com/angular/angular.js/issues/6723
答案 1 :(得分:0)
module的Angular文档指出:
推荐设置
虽然上面的示例很简单,但它不能扩展到大型应用程序。相反,我们建议你打破你的 应用于这样的多个模块:
- 服务模块,用于服务声明
- 指令模块,用于指令声明
- 过滤器模块,用于过滤器声明
- 应用程序级模块,它依赖于上述模块,并具有初始化代码。
当您使用调用app
的单个模块时,您正在创建该模块的config
与provider
声明之间的依赖关系。您应该做的是将所有提供者放在一个单独的模块中,例如:
var appr = angular.module('appr', [])
.provider('myService', function() {
this.$get = function() {};
})
然后使用:
声明app
的依赖关系
var app = angular.module('plunker', ['appr']);
查看更新的Plunker:http://plnkr.co/edit/Ym3Nlsm1nX4wPaiuVQ3Y?p=preview
此外,不要使用通用provider
,而应考虑使用provider
的更具体的实现,例如controller
,factory
或service
。请查看Module API文档以获取更多详细信息。