2013-03-11 2 views
12

から同じ名前の値を参照する方法:私は同じ<code>value</code>オブジェクトを定義するいくつかのモジュールがある場合は、異なるモジュール

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

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

お知らせm1m2の両方が同じ値testを持っています。

は次にメインモジュールでは、私は彼ら2依存:

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

は、同じページ内m1m2の両方からtestの値を表示する方法はありますか?

+0

[Angularjsのモジュールと名前の衝突]可能な複製(http://stackoverflow.com/questions/13406791/modules-and-name-clashes-in-angularjs) – shannon

答えて

12

短く - なしです。 AngularJSモジュールは1つの名前空間を形成します。 2つの異なるモジュールに同じ名前の2つの値を定義すると、実行時に1つのみが表示されます。これは、値だけでなく、すべてのプロバイダに適用されます。

これはAngularJSの将来のバージョンで対処されるかもしれませんが、今のところあなたの最良の選択肢は、値(および他のプロバイダ)の前にモジュール名を付けることです。

+5

私は接頭辞が好きではありません:( – Freewind

+0

@ Freewind私は、現時点では他の選択肢がないことを恐れています。 –

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

、モジュールの名前空間は、グローバルであるので、「FOO」のコントローラは「バー」からテスト値を取得します。しかし、angular.injector([... modules])を使うことによって、特定のモジュールから値/ services/whatnotを明示的に取り出すことができます。

もちろん、これはAngularのDIシステムではネイティブに動作しませんが、実際には関数(Foo){}または関数(){Foo = angular.injector(['myModule']) .get( 'Foo'); }はややタイピングですが、必ずしも悪くはありません(私たちはまだ手動で注射しています)。

また、ディレクティブとフィルタは、別の方法でユニークにする必要がありますが、出発点になります。