13

value同じオブジェクトを定義するいくつかのモジュールがある場合:

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

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

と の値が同じであることに注意m1してください。m2test

次に、メイン モジュールで、次の 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

同じページのtest両方m1の値を表示する方法はありますか?m2

4

2 に答える 2

12

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

これは、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」から Test 値を取得します。ただし、 angular.injector([...modules]) を使用することで、特定のモジュールから値/サービス/その他を明示的に取得できます。

もちろん、これは Angular の DI システムではネイティブに機能しませんが、個人的には function(Foo) {} または function() { Foo = angular.injector(['myModule']).get('フー'); } はタイピングが少し増えますが、必ずしも悪いわけではありません (手動でのみ何かを注入しています)。

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

于 2015-04-16T10:46:51.950 に答える