angular算是將後端開發工程化引入前端的先驅之一,而dependency injection依賴注入(後面簡稱為di)又是angular內部運作的核心功能,所以要深入理解angular有必要先理解這一核心概念。
維基百科對依賴注入的解釋
在軟體工程中,依賴注入是實現控制反轉的一種軟體設計模式,乙個依賴是乙個被其他物件(client)呼叫的物件(服務),注入則是將被依賴的物件(service)例項傳遞給依賴物件(client)的行為。將 被依賴的物件傳給依賴者,而不需要依賴者自己去建立或查詢所需物件是di的基本原則。 依賴注入允許程式設計遵從依賴倒置原則(簡單的說就是要求對抽象進行程式設計,不要對實現進行程式設計,這樣就降低了客戶與實現模組間的耦合) 呼叫者(client)只需知道服務的介面,具體服務的查詢和建立由注入者(injector)負責處理並提供給client,這樣就分離了服務和呼叫者的依賴,符合低耦合的程式設計原則。
依賴注入中的角色
從維基百科解釋可知, di中包含三個角色,呼叫者(client), 服務(service)和注入者 (injector),下面開始介紹本文的主題 angular的依賴注入。
angular依賴注入分析
先看看下面這段 hello,world** (注意:設定了嚴格模式或壓縮混淆**後 下面的**不能正常工作,後面有解釋)
.controller('ctl', function
($scope, $log) );
functioncreateinternalinjector(cache, factory)
var args =,
//查詢依賴
$inject =createinjector.$$annotate(fn, strictdi, servicename),
length, i,
key;
//中間一段略去...
//遍歷$inject陣列呼叫getservice獲取服務....
//開始執行client , args則是依賴的全部服務,injector都為我們建立好了
return
}//中間一段略去...
//這裡返回公開的injector物件
return
};}
原始碼中查詢依賴的原始碼如下:
functionannotate(fn, strictdi, name)
throw $injectorminerr('strictdi',
' is not using explicit annotation...', name);
}//針對直接在建構函式中使用服務的情況
//使用function.tostring() 然後正則匹配出依賴的物件
//所以上面例子如果混淆了**就呵呵了
//最後存入$inject陣列
fntext = fn.tostring().replace(strip_comments, '');
argdecl =fntext.match(fn_args);
foreach(argdecl[1].split(fn_arg_split), function
(arg) );
});}
//給建構函式新增$inject屬性
fn.$inject =$inject;}}
else
if(isarray(fn))
else
//返回依賴陣列
return
$inject;
}
看了上面的原始碼片段和解釋,想必大家對angular的依賴注入有了整體的認識。
下面是另外兩種推薦的宣告依賴的方式
1. 陣列注釋 (推薦), js壓縮混淆不會有影響。
.controller('ctl', ['$scope', '$log', function
($scope, $log) ]);
2.$inject 屬性 ,js壓縮混淆不會有影響
.controller('ctl', ctrl);
function
ctrl($scope, $log)
//給建構函式新增$inject屬性,
//$inject是乙個陣列,元素是依賴的服務名.
ctrl.$inject = ["$scope", "$log"];
angular引入了大量後端開發的概念,而前端同學可能還不熟悉,望本文能有所幫助。
Angular 依賴注入
依賴注入是實現控制反轉的一種實現方式,好處在於 降低耦合 使用元件常用性提高 便於測試 在angular中實現依賴注入需要三步 1.建立乙個service,這個service就是要依賴注入的物件 2.寫提供器 3.在建構函式中注入 angular 只允許在建構函式中注入 先建立乙個service n...
Angular 依賴注入
基本介紹 1 angularjs採用模組化的方式組織 將一些通用邏輯封裝成乙個物件或函式,實現最大程度的復用,這導致了使用者和被使用者之間存在依賴關係。2 所謂依賴注入是指在執行時自動查詢依賴關係,然後將查詢到依賴傳遞給使用者的一種機制。3 常見的angularjs內建服務有 http locati...
Angular依賴注入例項
先註冊服務shared product 輸入命令 ng g service shared product 生成乙個服務在shared包中 product.service.ts import from angular core injectable 裝飾器 這個productservice也可以通過建...