AngularJS中的"命名空间"服务

Esa*_*ola 37 angularjs

AngularJS如何处理服务名称之间的冲突?例如,如果我声明了两个模块,每个模块包含一个名为'foo'的服务.如果我想创建可重用模块或想避免与其他第三方模块发生冲突,那么"命名空间"服务的好方法是什么?

pko*_*rce 39

截至目前,AngularJS不处理服务的命名空间冲突,因此如果您有2个不同的模块,其服务命名方式相同,并且您在应用程序中包含这两个模块,则只有一个服务可用.

目前,最好的选择是使用自定义前缀为服务名称添加前缀,例如:

angular.module('myprefix_mymodule',['dep1', 'dep2']).factory('myprefix_MyService', ...)

  • 只有一个注释,你不能通过参数名称直接引用它,只能通过DI的名称数组:`['$ scope','myModule1.myService',function($ scope,myService){...}]` (19认同)
  • 我个人更喜欢使用点符号作为前缀 - 它看起来像真正的名称空间:)类型`factory('myModule1.myService')` (15认同)
  • @ValentynShybanov点吃得很好,但是如果你不缩小你的代码就会痛苦地为你服务.通常情况下,如果您同时控制您的服务和应用程序并不是一个问题,但如果您正在为其他人编写模块,则可能需要牢记这一点.对于简单的实验,人们可能希望被迫使用DI注释.但是,点看起来更好:-) (7认同)
  • @pkozlowski.opensource如果你没有像Valentyn指出的那样用依赖关系创建你的服务,你做错了.点不应该是一个问题 - 它也是我们这样做的方式,我们有一个应用程序,在7个不同的,相对较大的模块中提供超过100个服务.我们对所有控制器,工厂,供应商也这样做.您不能使用的唯一两个角度概念是指令和过滤器. (4认同)
  • @Oddman谢谢.我们关注过滤器和指令命名空间的方法是使用camelcasing.角度文档建议使用命名空间过滤器的下划线,但下划线不适用于指令命名空间,并且需要一些可以兼顾一致性的东西. (2认同)

小智 7

如pkozlowski所述,他们没有.您可以手动为所有服务添加前缀(这有点烦人),或者,我写了一个hack来为您命名. https://github.com/callmehiphop/angular-namespacer