2

从 Angular 的角度来看,服务提供者的注册顺序和模块配置代码似乎很重要:为了让配置代码找到提供者,应该先注册提供者。

这对我来说完全是一个惊喜,因为我认为 Angular 首先处理所有提供程序注册,以使它们可用于 DI,然后调用配置回调,如下所示:

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

请在此处查看演示问题的非常简短的测试。它在“未知提供商”上失败,您可以在 JS 控制台中看到它:http: //plnkr.co/edit/jGJmE2Fq7wOrwubdlTTX

我在这里错过了什么吗?这是预期的角度行为吗?

谢谢。

4

2 回答 2

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

于 2015-12-11T13:57:36.283 回答
0

模块的 Angular 文档指出:

推荐设置
虽然上面的示例很简单,但它不会扩展到大型应用程序。相反,我们建议您将应用程序分解为多个模块,如下所示:

  • 一个服务模块,用于服务声明
  • 指令模块,用于指令声明
  • 过滤器模块,用于过滤器声明
  • 以及一个依赖于上述模块的应用级模块,并具有初始化代码。

当您使用您调用的单个模块时app,您正在创建该模块config和 a 的声明之间的依赖关系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,factoryservice。查看Module API文档以获取更多详细信息。

于 2013-06-04T18:15:20.383 回答