2013-03-11 24 views
12

參考名稱相同的值。如果我有一些模塊,其定義了相同的對象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

有什麼辦法,以顯示在同一頁面的test無論從m1m2值是多少?

+0

[Angularjs中的模塊和名稱衝突]的可能重複(http://stackoverflow.com/questions/13406791/modules-and-name-clashes-in-angularjs) – shannon 2015-06-02 09:04:00

回答

12

總之 - 。 AngularJS模塊形成一個名稱空間。如果在2個不同的模塊上定義2個具有相同名稱的值,則只有一個值在運行時可見。這適用於任何提供者,而不僅僅是價值觀。

這可能會在未來版本的AngularJS中得到解決,但現在您最好的選擇是將您的值(和其他提供者)作爲模塊名稱的前綴

+5

我不喜歡前綴:( – Freewind 2013-03-11 16:02:12

+0

@ Freewind恐怕目前沒有其他選擇。 – 2013-03-11 16:04:25

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 
}]); 

至於其他的答案說,模塊命名空間是全球化,所以在「富」的控制器會從「酒吧」的測試值。但是,通過使用angular.injector([... modules]),我們可以顯式地從某些模塊中檢索值/服務/ whatnot。 (Foo){}或function(){Foo = angular.injector(['myModule'])當然,這本身並不適用於Angular的DI系統,但個人來說,它並不真正打擾我。獲得( '富'); }稍微打字一些,但不一定更糟糕(我們仍然只是手動注入某些東西)。

此外,指令和過濾器需要以另一種方式變得獨一無二,但它提供了一個起點。

相關問題