Как использовать две службы AngularJS с одинаковым именем из разных модулей?
Предположим, у меня есть два модуля для AngularJS, например. foo
и bar
, и оба они определяют службу под названием baz
.
В моем приложении я полагаюсь на них, говоря:
var app = angular.module('app', [ 'foo', 'bar' ]);
Затем я могу попытаться использовать службу baz
в контроллере, используя
app.controller('blaController', [ '$scope', 'baz', function($scope, baz) {
// ...
}]);
Как я могу определить, какую из двух служб я бы хотел использовать? Есть ли что-то такое, как полное имя?
Ответы
Ответ 1
Сервисный локатор ищет сервисы по имени (angularjs guide DI). Однако "Пространство имен" в AngularJS:
На сегодняшний день AngularJS не обрабатывает коллизии пространства имен для сервисов, поэтому, если у вас есть 2 разных модуля с сервисом, названным одинаково, и вы включаете оба модуля в свое приложение, будет доступен только один сервис.
Я предполагаю, что вы можете сделать полное имя "от руки": назовите сервис foo.baz
и bar.baz
вместо простого baz
. Это своего рода самообман. Более того, его написание не делает пространство имен реальным, но другой человек, который читает код, может подумать так.
Ответ 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
}