angular允許service將其他service聲明為依賴,使用在自身執行個體化時使用的建構函式中。
為了聲明依賴,我們需要在Factory 方法聲明中指定它們,並且在Factory 方法中通過$inject屬性(字串標識數組)或者使用array notation。
通常$inject屬性聲明可以被丟棄(即http://www.jb51.net/article/91815.htm中提到的隱式依賴注入,但這個是實驗屬性,在而且在壓縮混淆後會失效,慎用!)。
使用array notation
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,它們之間存在依賴關係,以及其他一些angular提供的service。
/** * 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');
例子中需要注意的事項:
- batchLog service依賴angular內建的$timeout(http://docs.angularjs.org/api/ng.$timeout)與$log services(http://docs.angularjs.org/api/ng.$log),實現通過console.log批量log訊息。
- routeTemplateMonitor service依賴內建的$route(http://docs.angularjs.org/api/ng.$route) service與我們自訂的batchLog service。
- 我們兩個service都使用Factory 方法簽名以及array notation來注釋inject,聲明它們的依賴。array中的字串標識的順序與Factory 方法簽名(參數)中的順序必須一致,這十分重要。除非在Factory 方法參數中使用隱式依賴聲明,否則,injector將根據array中字串的順序決定inject哪一個服務。
以上就是關於AngularJs Managing Service Dependencies 資料的整理,後續繼續添加相關資料,謝謝大家對本站的支援!