Angularjs order在angular.js中注册提供程序和配置模块时的重要性
从angular的角度来看,服务提供商和模块配置代码的注册顺序似乎很重要:为了让配置代码找到提供商,应该在注册之前注册提供商 这对我来说完全是一个惊喜,因为我认为angular首先处理所有提供程序注册,使它们可用于DI,然后调用配置回调,如下所示: module.config(函数(myServiceProvider){…}) 请看这里的一个非常简短的测试,它演示了这个问题。它在“未知提供程序”上失败,您可以在JS控制台中看到它: 我有什么遗漏吗?这是预期的角度行为吗Angularjs order在angular.js中注册提供程序和配置模块时的重要性,angularjs,Angularjs,从angular的角度来看,服务提供商和模块配置代码的注册顺序似乎很重要:为了让配置代码找到提供商,应该在注册之前注册提供商 这对我来说完全是一个惊喜,因为我认为angular首先处理所有提供程序注册,使它们可用于DI,然后调用配置回调,如下所示: module.config(函数(myServiceProvider){…}) 请看这里的一个非常简短的测试,它演示了这个问题。它在“未知提供程序”上失败,您可以在JS控制台中看到它: 我有什么遗漏吗?这是预期的角度行为吗 谢谢。角度文档说明: 推荐
谢谢。角度文档说明: 推荐设置
虽然上面的示例很简单,但它无法扩展到大型应用程序。相反,我们建议你打破你的习惯 适用于多个模块,如下所示:
- 服务模块,用于服务声明
- 指令模块,用于指令声明
- 过滤器模块,用于过滤器声明
- 以及应用级模块,其依赖于上述模块,并且具有初始化代码
app
的模块时,您正在该模块的config
和提供者的声明之间创建依赖关系。您应该做的是将所有提供商放在一个单独的模块中,例如:
var appr = angular.module('appr', [])
.provider('myService', function() {
this.$get = function() {};
})
然后,您可以使用以下方法声明应用程序的依赖关系:
var app = angular.module('plunker', ['appr']);
查看更新的Plunker:
此外,不要使用泛型<代码>提供程序< /> >,考虑使用<代码>提供者/>代码> >代码>控制器>代码>代码>工厂代码>代码>服务>代码>。查看文档了解更多详细信息。
在Angular的最新版本中,此行为似乎发生了变化(不确定确切时间)。我将你的Plunker修改为从1.0.7点到1.3.0点,它像你最初期望的那样工作正常
类似的代码示例:
var myModule=angular.module('myModule',[])
在将提供程序注册到模块之前运行提供程序的配置应该可以正常工作
参考
作为参考,这个报告的问题似乎已经解决了:正如您在这个()插件中看到的,您还可以避免将模块置于全局范围内。一旦定义了它们,就可以使用一个参数版本angular.module('myModule')
进行引用,并避免使用全局变量。我知道,将提供程序分离到不同的模块可以解决问题。但您建议的解决方案很难持久——将所有提供者分离到一个单独的模块中确实解决了一个特定的问题,但是当在这个模块中进行配置时,它需要另一个分离,从而导致无休止的模块来解决问题。我希望angular将provider()的优先级设置为高于config(),因此在之后调用它,或者至少将其记录为相等(使用相同的队列,从它们的实现中可以看出)。@Stas我不确定我是否理解您的评论。由于config
用于配置模块,因此在运行config
之前,您应该声明该模块的所有依赖项,包括所有提供程序,这是公平的。我不明白为什么这会导致“无休止的模块来解决问题”。一个简单的例子是,您可以使用所需的所有提供者创建一个“UtilitiesServices”模块,将该模块作为依赖项添加到应用程序模块中,然后在应用程序上运行config
。我错过了什么?
myModule.config((myServiceProvider) => {
});
myModule.service('myService', () => {
});