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

Posted

技术标签:

【中文标题】如何使用来自不同模块的两个具有相同名称的 AngularJS 服务?【英文标题】:How to use two AngularJS services with same name from different modules? 【发布时间】:2013-07-25 14:14:34 【问题描述】:

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

在我的应用程序中,我依靠它们说:

var app = angular.module('app', [ 'foo', 'bar' ]);

然后我可以尝试在控制器中使用baz服务

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

如何定义我想使用这两种服务中的哪一种?是否有诸如完全限定名称之类的东西?

【问题讨论】:

How to reference values with the same name from different modules的可能重复 "Namespacing" services in AngularJS的可能重复 Modules and name ***es in Angularjs的可能重复 【参考方案1】:

服务定位器按名称 (angularjs guide DI) 查找服务。不过"Namespacing" services in AngularJS:

截至今天,AngularJS 不处理服务的命名空间冲突 因此,如果您有 2 个不同的模块,并且服务名称相同 方式并且您在您的应用程序中包含这两个模块,只有一项服务将是 可用。

我猜您可以“手动”创建完全限定名称:将服务命名为 foo.bazbar.baz 而不是普通的 baz。这是一种自欺欺人。此外,以这种方式编写并不能使命名空间成为现实,但另一个阅读代码的人可能会这么认为。

【讨论】:

我忘了提到你可以通过闭包来缓解这个问题(function() module declaration());【参考方案2】:

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

我有两个 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
  

【讨论】:

以上是关于如何使用来自不同模块的两个具有相同名称的 AngularJS 服务?的主要内容,如果未能解决你的问题,请参考以下文章

两个不同的joomla模块,显示相同的信息

如何使用 django 在 mysql 中的两个不同模式中使用两个具有相同名称的表

如何比较具有不同名称引用但具有相同实际数据的两个列表

Delphi,如何在两个不同的包中安装具有相同名称的组件

Swift - 两个具有相同公共结构的框架

如何包含两个不同的标题,其中包含两个具有相同名称的不同类?