如果我有一些模块定义了相同的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
的值m1
已被m2
覆盖。
您可以在此处看到现场演示:http://plnkr.co/edit/u7u8p0nYqq9CvNxWKv5G?p=preview
有没有办法在同一页面显示来自test
和m1
的{{1}}的值?
答案 0 :(得分:12)
简而言之 - 不。 AngularJS模块形成一个名称空间。如果在2个不同的模块上定义2个具有相同名称的值,则在运行期间只能看到一个值。这适用于任何提供者,而不仅仅是值。
这可能会在AngularJS的未来版本中得到解决,但现在您最好的选择是为您的值(和其他提供商)添加模块名称。
答案 1 :(得分:0)
实际上,你可以(有点)这样做,但它需要更多的手工工作。 See this 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
}]);
正如其他答案所述,模块命名空间是全局的,所以控制器在&#39; foo&#39;从&#39; bar&#39;获取测试值。但是,通过使用angular.injector([... modules]),我们可以显式地从某些模块中检索值/服务/等等。
当然,这本身并不适用于Angular的DI系统,但是个人并不会因为函数(Foo){}或函数(){Foo = angular.injector而感到烦恼([&#39; Mymodule中&#39;])。得到(&#39;富&#39);打字稍微多一点,但不一定更糟(我们仍然只是手动注入一些东西)。
此外,指令和过滤器需要以另一种方式变得独特,但它提供了一个起点。