13

如果我有一些定义相同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]在最后一页。我可以看到 的值testm1被 的 之一覆盖m2

你可以在这里看到一个现场演示:http: //plnkr.co/edit/u7u8p0nYqq9CvNxWKv5G ?p=preview

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

4

2 回答 2

12

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

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

于 2013-03-11T15:55:57.327 回答
0

实际上,您可以(在某种程度上)这样做,但它需要更多的手动工作。看到这个 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”中的控制器从“bar”获取测试值。但是,通过使用 angular.injector([...modules]) 我们可以显式地从某些模块中检索值/服务/whatnot。

当然,这不适用于 Angular 的 DI 系统,但就我个人而言,这并没有真正困扰我,因为 function(Foo) {} 或 function() { Foo = angular.injector(['myModule']).get('富'); } 打字稍微多一点,但不一定更糟(我们仍在注入一些东西,只是手动注入)。

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

于 2015-04-16T10:46:51.950 回答