Подтвердить что ты не робот

Как ссылаться на значения с одинаковым именем из разных модулей

Если у меня есть некоторые модули, которые определяют один и тот же объект 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 на той же странице?

4b9b3361

Ответ 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'); } немного больше печатает, но не обязательно хуже (мы все еще что-то впрыскиваем, только вручную).

Кроме того, директивы и фильтры должны быть сделаны уникальными по-другому, но это дает отправную точку.