Angularjs 如何引用来自不同模块的同名值

Angularjs 如何引用来自不同模块的同名值,angularjs,Angularjs,如果我有一些模块定义相同的值对象: 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.controll

如果我有一些模块定义相同的
对象:

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>

[{{test}}]
它将在最后一页显示
[BBB]
。我可以看到
m1
test
值已被
m2
的值覆盖

您可以在此处看到现场演示:


有没有办法在同一页中同时显示
m1
m2
中的
test
的值?

简而言之-no。AngularJS模块形成一个名称空间。如果在两个不同的模块上定义了两个同名的值,则在运行时只有一个值可见。这适用于任何提供者,而不仅仅是值

这可能会在AngularJS的未来版本中得到解决,但现在您最好的选择是在您的值(和其他提供者)前面加上一个模块名

实际上,您可以(某种程度上)这样做,但这需要更多的手动工作

正如其他答案所述,模块名称空间是全局的,因此“foo”中的控制器从“bar”获取测试值。但是,通过使用angular.injector([…modules]),我们可以显式地从某些模块检索值/服务/诸如此类的内容

当然,这在Angular的DI系统中本机不起作用,但就我个人而言,这并不真正困扰我,因为function(Foo){}或function(){Foo=Angular.injector(['myModule']]).get('Foo');}的类型稍微多一些,但不一定更糟(我们仍然在注入某些东西,只是手动)


此外,指令和过滤器需要以另一种方式变得唯一,但它提供了一个起点。

@Freewind目前恐怕没有其他选择。可能的重复
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
}]);