注册提供程序和在angular.js中配置模块的顺序的重要性

时间:2013-06-04 14:41:56

标签: angularjs

从角度来看,似乎注册服务提供商和模块配置代码的顺序很重要:为了使配置代码能够找到提供者,提供者应该在之前注册。

这对我来说是一个惊喜,因为我认为angular首先处理所有提供者注册,使它们可用于DI,然后调用config回调,如下所示:

module.config(function(myServiceProvider){...});

请在这里看到一个非常简短的测试来证明这个问题。它在“未知提供者”上失败,您可以在JS控制台中看到它:http://plnkr.co/edit/jGJmE2Fq7wOrwubdlTTX

我在这里遗漏了什么?这是一种预期的角度行为吗?

感谢。

2 个答案:

答案 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的单个模块时,您正在创建该模块的configprovider声明之间的依赖关系。您应该做的是将所有提供者放在一个单独的模块中,例如:

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的更具体的实现,例如controllerfactoryservice。请查看Module API文档以获取更多详细信息。