AngularJS - 模块依赖项,命名冲突

时间:2015-05-21 13:18:36

标签: javascript angularjs angularjs-module

我有两个第三方模块,它们都定义了一个名称相同的工厂。显然,如果不诉诸于kludge,我无法控制这些模块的命名。

此外,我还有两个内部模块,每个模块使用两个第三方模块中的不同模块作为依赖项(如下所示)。我确信我无法访问当前模块依赖项中未列出的模块中的组件,但事实证明我错了。

即使own1取决于thirdParty1hello定义为hello world),它也会hi there(来自thirdParty2)控制器。其他模块的配对也是如此。

有没有办法“隔离”模块,所以我只能使用我明确依赖的东西?如果没有,如果我可以随时达到任何目的,那么拥有模块有什么意义(假设主应用程序模块将其作为依赖项)?此外,如果我有两个名为hello的组件的模块,我怎么知道哪个将被使用?

这是http://jsbin.com/vapuye/3/edit?html,js,output

的jsbin
angular.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

2 个答案:

答案 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;
});

这使您可以在应用程序的所有其他部分使用hello1hello2

答案 1 :(得分:2)

由于模块(或模块组件)没有内置名称间距,因此实现目标的最佳方法是为模块使用唯一的命名约定。大多数角色的图书馆都这样做,然后你应该好好去。

除了封装应用程序行为外,模块还可以帮助测试和模拟应用程序。

我不认为角度可以区分两个命名相同的组件(我认为这会改变角度2)。我可能会说两个命名相同的组件也可能会这样做,你应该看看为什么你需要它们?