Как использовать две службы AngularJS с одинаковым именем из разных модулей?

Предположим, у меня есть два модуля для AngularJS, например. foo и bar, и оба они определяют службу под названием baz.

В своем заявлении я полагаюсь на них, говоря:

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

Затем я могу попробовать использовать службу baz в контроллере, используя

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

Как я могу определить, какой из двух сервисов я бы хотел использовать? Есть ли что-то вроде полного имени?


person Golo Roden    schedule 25.07.2013    source источник
comment
возможный дубликат Как ссылаться на значения с тем же название из разных модулей   -  person Stewie    schedule 25.07.2013
comment
возможный дубликат служб пространств имен в AngularJS   -  person James Lawruk    schedule 10.12.2014
comment
возможный дубликат модулей и конфликтов имен в Angularjs   -  person shannon    schedule 02.06.2015


Ответы (2)


Локатор сервисов ищет сервисы по имени (angularjs guide DI). Однако службы пространств имен в AngularJS:

На сегодняшний день AngularJS не обрабатывает коллизии пространств имен для служб, поэтому, если у вас есть 2 разных модуля с одинаковым названием службы и вы включаете оба модуля в свое приложение, будет доступна только одна служба.

Думаю, вы можете создать полное имя «вручную»: назовите службу foo.baz и bar.baz вместо простого baz. Это своего рода самообман. Более того, такое написание не делает пространство имен реальным, но другой человек, читающий код, может так думать.

person Eduard Gamonal    schedule 25.07.2013
comment
Я забыл упомянуть, что вы можете смягчить это с помощью закрытий (function() { module declaration}()); - person Eduard Gamonal; 10.02.2014

Когда у нас есть две службы с одинаковым именем, вы должны различать их при использовании в вашем локальном модуле. Давайте посмотрим на код ниже, чтобы понять, как это работает,

У меня есть две службы 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
  }
person Yogaraj Saravanan    schedule 04.06.2019