Как ссылаться на значения с одинаковым именем из разных модулей
Если у меня есть некоторые модули, которые определяют один и тот же объект value
:
var m1 = angular.module('m1', []);
m1.value('test', 'AAA');
var m2 = angular.module('m2', []);
m2.value('test', 'BBB');
Примечание m1
и m2
оба имеют одинаковое значение test
.
Тогда в основном модуле я буду зависеть от них два:
var app = angular.module('angularjs-starter', ['m1','m2']);
app.controller('MainCtrl', function($scope, test) {
$scope.test = test;
});
И HTML очень прост:
<body ng-controller="MainCtrl">
[{{test}}]
</body>
Он отобразит [BBB]
на последней странице. Я вижу, что значение test
of m1
было переопределено одним из m2
.
Здесь вы можете увидеть живое демо: http://plnkr.co/edit/u7u8p0nYqq9CvNxWKv5G?p=preview
Есть ли способ показать значения test
как из m1
, так и m2
на той же странице?
Ответы
Ответ 1
Короче - нет. Модули AngularJS образуют одно пространство имен. Если вы определяете 2 значения с тем же именем на двух разных модулях, только одно будет отображаться во время выполнения. Это относится к любым провайдерам, а не только к значениям.
Это может быть рассмотрено в будущих версиях AngularJS, но теперь ваш лучший вариант - префикс ваших значений (и других поставщиков) с именем модуля.
Ответ 2
Собственно, вы можете (вроде) сделать это, но для этого требуется немного более ручная работа. См. этот plunkr.
var foo = angular.module('foo', ['ng']).value('test', 1);
var bar = angular.module('bar', ['foo']).value('test', 2);
console.log(angular.injector(['foo']).get('test')); // 1
bar.service('original', ['test', function(test) {
console.log(test); // 2
}]);
Как указывалось в других ответах, пространство имен модулей является глобальным, поэтому контроллер в 'foo' получает значение Test из "bar". Однако, используя angular.injector([... modules]), мы можем явно получить значения/сервисы/whatnot от определенных модулей.
Конечно, это не работает с системой Angular DI, но лично это меня действительно не беспокоит, поскольку функция (Foo) {} или function() {Foo = angular.injector(['myModule.]) получаем ( 'Foo'); } немного больше печатает, но не обязательно хуже (мы все еще что-то впрыскиваем, только вручную).
Кроме того, директивы и фильтры должны быть сделаны уникальными по-другому, но это дает отправную точку.