【问题标题】:How to reference values with the same name from different modules如何引用来自不同模块的同名值
【发布时间】:2013-02-26 20:52:39
【问题描述】:

如果我有一些模块定义了相同的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]。我可以看到m1 的值test 已被m2 覆盖。

您可以在这里观看现场演示:http://plnkr.co/edit/u7u8p0nYqq9CvNxWKv5G?p=preview

有什么方法可以在同一页面中同时显示来自m1m2test 的值?

【问题讨论】:

标签: angularjs


【解决方案1】:

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

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

【讨论】:

  • @Freewind 恐怕目前没有其他选择了。
【解决方案2】:

实际上,您可以(在某种程度上)做到这一点,但这需要更多的手动工作。 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
}]);

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    相关资源
    最近更新 更多