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). И я могу утверждать, что два компонента, которые называются одинаковыми, могут сделать то же самое, и вы должны посмотреть, почему вам нужны оба?