如何使用来自不同模块的两个同名AngularJS服务?

如何使用来自不同模块的两个同名AngularJS服务?,angularjs,angularjs-service,angularjs-module,Angularjs,Angularjs Service,Angularjs Module,假设我有两个AngularJS模块,例如foo和bar,它们都定义了一个名为baz的服务 在我的申请中,我依靠他们说: var app = angular.module('app', [ 'foo', 'bar' ]); 然后,我可以尝试在控制器中使用baz服务,方法是使用 app.controller('blaController', [ '$scope', 'baz', function($scope, baz) { // ... }]); 如何定义我要使用的两个服务中的哪一个?是否

假设我有两个AngularJS模块,例如
foo
bar
,它们都定义了一个名为
baz
的服务

在我的申请中,我依靠他们说:

var app = angular.module('app', [ 'foo', 'bar' ]);
然后,我可以尝试在控制器中使用
baz
服务,方法是使用

app.controller('blaController', [ '$scope', 'baz', function($scope, baz) {
  // ...
}]);

如何定义我要使用的两个服务中的哪一个?是否存在诸如完全限定名之类的内容?

服务定位器按名称()查找服务。然而:

到今天为止,AngularJS不处理服务的名称空间冲突 因此,如果您有两个不同的模块,其服务名称相同 如果您在应用程序中同时包含这两个模块,则将只提供一项服务 可用


我想您可以“手工”命名完全限定的名称:将服务命名为
foo.baz
bar.baz
,而不是普通的
baz
。这是一种自我错觉。此外,以这种方式编写并不能实现名称空间,但另一个阅读代码的人可能会这样认为。

当我们有两个同名的服务时,您必须在本地模块中使用它来区分它们。让我们看看下面的一些代码来了解它是如何工作的

我有两个Util服务,需要区分它们

angular
  .module('module1', [
  ])
  .service('UtilService', UtilService)
  .service('another.UtilService', UtilService)
  .name;
在控制器文件中,您可以像下面那样简单地注入

export class Controller {
  public static $inject: string[] = ['UtilService', 'another.UtilService'];

constructor(
    private utilService: UtilService,
    private anotherUtilService
  ) {
     console.log(this.utilService) // will print the main util service methods
     console.log(this.anotherUtilService) // will print the another util service 
     methods
  }

可能重复的可能重复的可能重复的我忘了提到,您可以通过闭包
(function(){module declaration}())来缓解这一问题