Anguar允许service声明其它services作为构建自己实例的依赖。
为了声明依赖,你需要在工厂函数的签名中指定它们,使用$inject
属性以service名称数组的方式,或使用数组标记的方式来声明。其中$inject
属性声明可以被丢弃(参看推断$inject
),不过要注意这目前还是一个实验性的功能。
使用数组标记
function myModuleCfgFn($provide) {
$provide.factory('myService', ['dep1', 'dep2', function(dep1, dep2) {}]);
}
使用$inject属性:
function myModuleCfgFn($provide) {
var myServiceFactory = function(dep1, dep2) {};
myServiceFactory.$inject = ['dep1', 'dep2'];
$provide.factory('myService', myServiceFactory);
}
使用DI推断(与代码压缩不兼容)
function myModuleCfgFn($provide) {
$provide.factory('myService', function(dep1, dep2) {});
}
下面这个例子中,自定义了两个service,一个依赖于另一个,还依赖Anguar中提供的其它service:
/**
batchLog service allows for messages to be queued in memory and flushed
to the console.log every 50 seconds.
*
@param {} message Message to be logged.
/
function batchLogModule($provide){
$provide.factory('batchLog', ['$timeout', '$log', function($timeout, $log) {
var messageQueue = [];
function log() {
if (messageQueue.length) {
$log('batchLog messages: ', messageQueue);
messageQueue = [];
}
$timeout(log, 50000);
}
// start periodic checking
log();
return function(message) {
messageQueue.push(message);
}
}]);
/**
['$route', 'batchLog', '$rootScope',
function($route, batchLog, $rootScope) {
// get the main service to kick of the application
angular.injector([batchLogModule]).get('routeTemplateMonitor');
本例中需要注意的:
batchLog
service依赖于内置的$timeout
和$log
services,它允许信息以批处理方式写进console.log
中
routeTemplateMonitor
service依赖于内置的$route
service,和自定义的batchLog
service
这两个services都使用了array notation方式来声明依赖。注意数组中的字符串顺序非常重要,它们与最后传给工厂方法中的service的顺序相同。与“依赖推断”不同,那个是根据参数名来推断的,顺序不重要。
ng
injector