2013-06-04 27 views
1

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

这对我来说总有意外惊喜,因为我认为,第一角处理所有供应商的注册,使它们可用于DI,然后调用配置回调,像这样:

module.config(函数(myServiceProvider ){...});

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

我在这里丢失了什么吗?它是一个预期的角度行为?

谢谢。

回答

1

看起来这种行为已经在更新版本的Angular中改变了(不确定何时确切地)。我将你的Plunker修改为从1.0.7指向1.3.0,它的工作原理没有错误,正如你最初的预期。

类似的代码示例: var myModule = angular。模块('myModule',[]);

myModule.config((myServiceProvider) => { 
}); 

myModule.service('myService',() => { 
}); 

在向模块注册提供程序之前运行提供程序的配置应该可以正常工作,正如您所期待的那样。

参考

以供参考,该报告的问题似乎是一个已经解决了它:https://github.com/angular/angular.js/issues/6723

0

module状态的角文档:

推荐设置
虽然上面的例子是简单的,也不会扩展到大的应用程序。相反,我们建议您打破你 应用到多个模块是这样的:

  • 服务模块,为服务声明
  • 一个指令模块,用于指示声明
  • 滤波器模块,用于过滤声明
  • 和一个依赖于上述模块的应用程序级模块,它有初始化代码。

当您使用您致电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,可以考虑使用更具体的实施中,如controllerproviderfactoryØ r service。请参阅Module API文档以获取更多详细信息。

+0

正如你可以从中看到(http://plnkr.co/edit/iueOj8RuvGGSwI80MePb? p = preview)plunker,你也可以避免将模块放在全局范围内。一旦你定义了它们,你可以引用一个arg版本'angular.module('myModule')'并且避免使用全局变量。 – rewritten

+0

我知道将提供者分离到不同的模块可以解决问题。但是,您提出的解决方案并不长久 - 将所有提供商分离为单独的模块确实解决了一个特定的问题,但是,如果在此模块中进行配置,则需要再次分离,导致无尽的模块来解决问题。我期望angular会优先考虑provider()高于config(),所以在之后调用它,或者至少将它记录为相等(使用相同的队列,如从它们的实现中可以看到的那样)。 – Stas

+0

@Stas我不确定我是否理解你的评论。由于'config'用于配置模块,因此Angular期望您在运行'config'之前声明该模块的所有依赖关系,包括所有提供者。我不明白为什么这会导致“无尽的模块来解决这个问题”。一个简单的例子可能是您创建了一个“UtilitiesServices”模块,包含您需要的所有提供程序,将该模块添加为您应用程序模块的依赖项,然后在您的应用程序上运行“config”。我错过了什么? – marcoseu