如何从不同的模块引用具有相同名称的值

时间:2013-03-11 15:39:16

标签: angularjs

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

var m1 = angular.module('m1', []);
m1.value('test', 'AAA');

var m2 = angular.module('m2', []);
m2.value('test', 'BBB');

注意m1m2都具有相同的值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

有没有办法在同一页面显示来自testm1的{​​{1}}的值?

2 个答案:

答案 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);打字稍微多一点,但不一定更糟(我们仍然只是手动注入一些东西)。

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