我有两个第三方模块,它们都定义了一个名称相同的工厂。显然,如果不诉诸于kludge,我无法控制这些模块的命名。
此外,我还有两个内部模块,每个模块使用两个第三方模块中的不同模块作为依赖项(如下所示)。我确信我无法访问当前模块依赖项中未列出的模块中的组件,但事实证明我错了。
即使own1
取决于thirdParty1
(hello
定义为hello world
),它也会hi there
(来自thirdParty2
)控制器。其他模块的配对也是如此。
有没有办法“隔离”模块,所以我只能使用我明确依赖的东西?如果没有,如果我可以随时达到任何目的,那么拥有模块有什么意义(假设主应用程序模块将其作为依赖项)?此外,如果我有两个名为hello
的组件的模块,我怎么知道哪个将被使用?
这是http://jsbin.com/vapuye/3/edit?html,js,output
的jsbinangular.module('app', ['own1', 'own2']);
//third-party modules
angular.module('thirdParty1', []).factory('hello', function () {
return 'hello world';
});
angular.module('thirdParty2', []).factory('hello', function () {
return 'hi there';
});
// "own" modules
angular.module('own1', ['thirdParty1']).controller('Own1Ctrl', function(hello) {
this.greet = hello;
});
angular.module('own2', ['thirdParty2']).controller('Own2Ctrl', function(hello) {
this.greet = hello;
});
结果:
<body ng-app="app">
<div ng-controller="Own1Ctrl as own1">
Own1: {{ own1.greet }}
</div>
<div ng-controller="Own2Ctrl as own2">
Own2: {{ own2.greet }}
</div>
</body>
是:
Own1: hi there
Own2: hi there
答案 0 :(得分:18)
您可以显式请求某个模块的工厂(无需依赖注入):
var injector = angular.injector(['thirdParty1']);
var hello1 = injector.get('hello');
var injector = angular.injector(['thirdParty2']);
var hello2 = injector.get('hello');
您也可以使用它来将第三方工厂包装到自己的工厂中:
angular.module('own1', ['thirdParty1']).factory('hello1', function () {
var injector = angular.injector(['thirdParty1']);
var hello = injector.get('hello');
return hello;
});
angular.module('own2', ['thirdParty2']).factory('hello2', function () {
var injector = angular.injector(['thirdParty2']);
var hello = injector.get('hello');
return hello;
});
这使您可以在应用程序的所有其他部分使用hello1
和hello2
。
答案 1 :(得分:2)
由于模块(或模块组件)没有内置名称间距,因此实现目标的最佳方法是为模块使用唯一的命名约定。大多数角色的图书馆都这样做,然后你应该好好去。
除了封装应用程序行为外,模块还可以帮助测试和模拟应用程序。
我不认为角度可以区分两个命名相同的组件(我认为这会改变角度2)。我可能会说两个命名相同的组件也可能会这样做,你应该看看为什么你需要它们?