我正在玩angular services并发现我可以使用角度服务,甚至无需注入module
。我创建了3个模块,即moduleA, moduleB, app
。 moduleA
& moduleB
彼此独立,但app
模块取决于moduleA
和moduleB
。这就是我创建模块的方式。
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
,但仍然可以访问ServiceA
中moduleA
的{{1}} ServiceB
。我不知道为什么会这样。我从模块中理解的是它们类似于Java或Dot Net的moduleB
或package
。无论我们在模块中创建什么,都在于该特定模块。要获取该模块中定义的服务或特殊对象,我必须注入模块。但是不知道为什么我甚至不用注射它就可以访问它。这是要播放的fiddle。
答案 0 :(得分:2)
加载模块后,其服务可用于注入。一旦在当前$injector
上定义了服务提供者,它就不会保存它所属的模块。
上面的代码是可行的,但它指定了一个坏习惯,因为如果未加载moduleA
,它将无法工作。根据经验,模块应该加载它们所依赖的模块。可以在几个相关模块中加载模块,它只加载一次。
config
块中的提供者注入器变得更加复杂(服务提供者和服务实例有two separate $injector
s)。
对于此装货单
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