理解Angular 服務
什么是Angular Service
Angular 服務是為web應用執行特定任務的單例對象或方法。 注:如果組件是為了內容呈現的功能復用,那么服務就是為組件進行功能復用。
Angular有一些內建的服務(例如:$http),也可以創建自己的服務。內建的服務通常使用“$”開頭(與jQuery類似)。
使用Angular 服務
在使用Angular服務的時候,只要將其注冊成為Angular組件的一個依賴項目就可以了。Angular會自動對這個服務進行實例化、信賴處理等。
Angular使用“constructor”(構造器)進行信賴注入。信賴將會傳遞給組件的工廠或構造器方法。因為JavaScript是一個動態類型的語言,Angular的信賴注入子系統不能使用靜態的類型來識別服務的信賴。因此,一個組件必須明確的通過使用一種“注釋”注入方法來定義它的信賴。例如,使用$inject屬性:
var MyController = function($location) { ... };
MyController.$inject = ['$location'];
myModule.controller('MyController', MyController);
或者提供一個內聯的注入“注釋”:
var myService = function($http) { ... };
myModule.factory('myService', ['$http', myService]);
參考:
定義一個服務
應用開發人員通過在Angular模塊中注冊“名字”與“服務工廠”來定義自己的服務。
服務的工廠方法的目的是用來生成單例對象(或者方法function)。生成的對象或者方法可以通過指定到這個服務的信賴來被注入到任意的組件當中。
Angular工廠方法使用消極執行策略,這意味着,只有當需要處理一個依賴的時候,才會為每一個服務執行一次。所有的事項都是依賴於這個服務來獲取一個被服務工廠方法生成的實例。
管理服務信賴
Angular允許服務聲明其他的服務作為信賴需要,用來構造它們的實例。
為了聲明依賴,你可以在工廠方法的參數中指定它們,然后通過使用$inject屬性、字符串數組或數組注釋以注入注釋標明這個方法。
使用數組注釋:
function myModuleCfgFn($provide) {
$provide.factory('myService', ['dep1', 'dep2', function(dep1, dep2) {}]);
}
使用$inject屬性:
下面是兩個服務的例子,其中一個依賴另一個,並且這兩個服務都依賴Angular框架提供的其他服務:
注意:
- batchLog服務依賴於內建的$timeout和$log服務,並且允許消息輸出到console.log日志文件中。
- routeTemplateMonitor服務依賴於內建的$route服務就像我們自定義的batchLog服務。
- 我們的兩個服務都使用工廠方法來標識和數組注釋來注入注釋以聲明它們的依賴。這里要注意的是,在數組中字符串的順序要與在工廠方法的參數列表中的一致。除非依賴是從方法的參數列表中推斷出來的,這個帶有ID的數組和它們被注入的順序決定各個服務被注入到哪里。
參考: