AngularJS - зависимости от модулей, именование

У меня есть два сторонних модуля, которые определяют factory с тем же именем. Очевидно, что я не имею никакого контроля над наименованием этих модулей, не прибегая к kludge.

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

Здесь даже если own1 зависит от thirdParty1 (который имеет hello, определенный как hello world), он получает hi there (от thirdParty2) в контроллере. То же самое касается пары других модулей.

Есть ли способ "изолировать" модули, поэтому я могу использовать только те вещи, от которых я явно зависим? Если нет, то какой смысл иметь модули, если я могу достичь чего-либо в любое время (при условии, что основной модуль приложения имеет это как его зависимость)? Также, если у меня есть два модуля с компонентами с именем hello, как я могу определить, что будет использоваться?

Вот jsbin для http://jsbin.com/vapuye/3/edit?html,js,output

angular.module('app', ['own1', 'own2']);

//third-party modules
angular.module('thirdParty1', []).factory('hello', function () {
  return 'hello world';
});

angular.module('thirdParty2', []).factory('hello', function () {
  return 'hi there';
});

// "own" modules
angular.module('own1', ['thirdParty1']).controller('Own1Ctrl', function(hello) {
  this.greet = hello;
});

angular.module('own2', ['thirdParty2']).controller('Own2Ctrl', function(hello) {
  this.greet = hello;
});

И результат:

<body ng-app="app">
  <div ng-controller="Own1Ctrl as own1">
    Own1: {{ own1.greet }}
  </div>
  <div ng-controller="Own2Ctrl as own2">
    Own2: {{ own2.greet }}
  </div>
</body>

Есть:

Own1: hi there
Own2: hi there

Ответ 1

Вы можете запросить factory определенного модуля явно (без инъекции зависимостей):

var injector = angular.injector(['thirdParty1']);
var hello1 = injector.get('hello');

var injector = angular.injector(['thirdParty2']);
var hello2 = injector.get('hello');

Вы также можете использовать это, чтобы обернуть сторонние фабрики на собственные фабрики:

angular.module('own1', ['thirdParty1']).factory('hello1', function () {
  var injector = angular.injector(['thirdParty1']);
  var hello = injector.get('hello');
  return hello;
});

angular.module('own2', ['thirdParty2']).factory('hello2', function () {
  var injector = angular.injector(['thirdParty2']);
  var hello = injector.get('hello');
  return hello;
});

Это позволяет использовать hello1 и hello2 во всех других частях вашего приложения.

Ответ 2

Поскольку нет встроенного межстрочного интервала модулей (или компонентов модулей), лучший способ достичь вашей цели - использовать уникальное соглашение об именах для ваших модулей. Большинство библиотек для angular делают это, и тогда вам должно быть хорошо идти.

Помимо инкапсуляции поведения ваших приложений, модули помогают тестировать и издеваться над вашим приложением.

Я не думаю, что для angular возможно различать два компонента, которые называются одинаковыми (я думаю, что это изменяется с помощью angular 2). И я могу утверждать, что два компонента, которые называются одинаковыми, могут сделать то же самое, и вы должны посмотреть, почему вам нужны оба?