为什么我可以在不注入模块的情况下访问角度服务?

时间:2016-06-16 13:52:38

标签: javascript angularjs dependency-injection

我正在玩angular services并发现我可以使用角度服务,甚至无需注入module。我创建了3个模块,即moduleA, moduleB, appmoduleA& moduleB彼此独立,但app模块取决于moduleAmoduleB。这就是我创建模块的方式。

angular.module('moduleA',[]);
angular.module('moduleB',[]);
angular.module('app',['moduleA', 'moduleB']); 

moduleA我有服务ServiceA,在moduleB我有服务ServiceB。这就是我如何定义服务:

moduleA< - ServiceA:

(function() {
  var app = angular.module('moduleA', []);
  app.service('ServiceA', function() {
    'use strict';
    this.greet = function() {
      alert('Greetings From Service A');
    };
  });
}());

moduleB< - ServiceB:我在serviceA注入serviceB

(function() {
  'use strict';
  var app = angular.module('moduleB', []);
  app.service('ServiceB', function(ServiceA) {
    // I have not injected moduleA in moduleB but still
    // Don't know why I am able to access ServiceA
    // in ServiceB. Ideally I should not be able to access
    // anything which is defined in moudleA unlesss and until
    // I do not inject moduleA in moudleB.
    console.log(ServiceA);
    this.greet = function() {
      ServiceA.greet();
    };
  });
}());

最后 app模块:

(function() {
  'use strict';
  var app = angular.module('app', ['moduleA', 'moduleB']);
  app.controller('MainController', ['$scope', 'ServiceA', 'ServiceB', function($scope, ServiceA, ServiceB) {
    $scope.greet = function() {
      ServiceB.greet();
    };
  }])
}());

现在关注的是我没有在moduleA中注入moduleB,但仍然可以访问ServiceAmoduleA的{​​{1}} ServiceB我不知道为什么会这样。我从模块中理解的是它们类似于Java或Dot Net的moduleBpackage。无论我们在模块中创建什么,都在于该特定模块。要获取该模块中定义的服务或特殊对象,我必须注入模块。但是不知道为什么我甚至不用注射它就可以访问它。这是要播放的fiddle

2 个答案:

答案 0 :(得分:2)

加载模块后,其服务可用于注入。一旦在当前$injector上定义了服务提供者,它就不会保存它所属的模块。

上面的代码是可行的,但它指定了一个坏习惯,因为如果未加载moduleA,它将无法工作。根据经验,模块应该加载它们所依赖的模块。可以在几个相关模块中加载模块,它只加载一次。

config块中的提供者注入器变得更加复杂(服务提供者和服务实例有two separate $injectors)。

对于此装货单

angular.module('app',['moduleA', 'moduleB']); 

这将按预期工作,因为在ServiceA块运行时已经定义了config服务提供程序:

angular.module('moduleB', []).config(function (ServiceAProvider) { ... });

并为此装货订单

angular.module('app',['moduleB', 'moduleA']); 

将抛出

注入器错误,因为config块在app.service('ServiceA', ...)定义ServiceAProvider服务提供商之前运行。 app.service方法可能会早于config运行,但服务定义会排队等待,并且不会立即生效。

答案 1 :(得分:0)

如果你在app中注入moduleA和moduleB,app中的所有模块都将能够访问moduleA和moduleB的服务。这就是为什么你不需要在moduleA中注入moduleB的原因。这就是依赖关系在角度中的工作方式。

如果您希望moduleA仅在moduleB中注入(因为mainController中不需要它),您只需从app模块中删除moduleA和ServiceA,并仅将它们注入moduleB。

var app = angular.module('moduleB', ['moduleA']);

请参阅此处fiddle