原版地址:http://docs.angularjs.org/guide/dev_guide.services.managing_dependencieshtml
angular容許service將其餘service聲明爲依賴,使用在自身實例化時使用的構造函數中。angularjs
爲了聲明依賴,咱們須要在工廠方法聲明中指定它們,而且在工廠方法中經過$inject屬性(字符串標識數組)或者使用array notation。express
一般$inject屬性聲明能夠被丟棄(即http://www.cnblogs.com/lcllao/archive/2012/10/16/2726967.html中提到的隱式依賴注入,但這個是實驗屬性,在並且在壓縮混淆後會失效,慎用!)。bootstrap
function myModuleCfgFn ($provide) { $provide.factory(‘myService’,[‘dep1’,’dep2’,function(dep1,dep2){}]); }
function myModuleCfgFn($provide) { var myServiceFactory = function(dep1, dep2) {}; myServiceFactory.$inject = ['dep1', 'dep2']; $provide.factory('myService', myServiceFactory); }
function myModuleCfgFn($provide) { $provide.factory('myService', function(dep1, dep2) {}); }
下面有一個例子,裏面有兩個service,它們之間存在依賴關係,以及其餘一些angular提供的service。api
/** * batchLog service 容許消息在內存中造成隊列,50秒flush一次。 * * @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); } log(); return function(message) { messageQueue.push(message); } }]); /** * routeTemplateMonitor監控每個route的變化,每一個比阿奴啊都會經過batchLog service記錄下來 */ $provide.factory('routeTemplateMonitor', ['$route', 'batchLog', '$rootScope', function($route, batchLog, $rootScope) { $rootScope.$on('$routeChangeSuccess', function() { batchLog($route.current ? $route.current.template : null); }); }]); } // 得到主service,運行應用(監聽事件) angular.injector([batchLogModule]).get('routeTemplateMonitor');
例子中須要注意的事項:數組