再談angularjs DI(Dependency Injection)

???? 在前面已經介紹了關于angularjs,以及擴展了一些jQuery ui的一些組件為angularjs的directive。在這里應進口007 上篇留言我們來看看在angularjs中的DI特性。

??? DI:依賴注入,是一種軟件設計模式,應DIP依賴倒置原則,描述組件之間高層組件不應該依賴于底層組件。依賴倒置是指實現和接口倒置,采用自頂向下的方式關注所需的底層組件接口,而不是其實現。其應用框架則為IOC,在.net中有很多我們熟悉的IOC框架,如Unity,Castle windsor,Ninject,Autofact等等,其常常分為構造注入,函數注入,屬性注。同時在IOC和Service Locator(服務查找),如果你想更多的了解IOC和DI請參見martin fowler的Inversion of Control Containers and the Dependency Injection pattern。

???? 回到angularjs:在框架中為我們提供了angular.injector(modules)DI注入注射器。但是在我們使用注入的時候常常是不需要關心具體的如何注入。我們只需要按照其規則書寫我們的angularjs代碼就會很容易的得到angularjs的DI特性,DI方式有三種:

1:推斷式注入:在angularjs中我們可以在我們需要注入的地方按照名稱注入,這里要求參數名稱必須和注入服務實例名稱相同,一種名稱約定。angularjs會提取參數名稱查找相應DI實例注入。

例如:

?1?var?myModule?=?angular.module('myModule',?[]);
?2?
?3?myModule.factory('$alert',?function($window)?{
?4?
?5?????return?{
?6?????????alert:?function(text)?{
?7?????????????$window.alert(text);
?8?????????}
?9?????};
10?});
11?
12?var?myController?=?function($scope,?$alert)?{
13?????$scope.message?=?function(msg)?{
14?????????console.log(msg);
15?????????$alert.alert(msg);
16?????};
17?};
18?myModule.controller("myController",?myController);?

?

在上面實例我利用已知的window服務新建了一個alert的服務.并利用注入到我們的controller使用.這里采用的都是約定注入(根據參數名稱注入).

jsfiddle在線演示http://jsfiddle.net/whitewolf/zyA5B/7/

?

2:標記注入:在angularjs中我們可以利用$inject標注DI注入,這里需要注入服務名稱的順序和構造參數名對應.這里可以解決以上約定的死板性.

將上例代碼改變為如下:

代碼如下:

?1?var?myModule?=?angular.module('myModule',?[]);
?2?
?3?myModule.factory('$alert',?['$window',?function($window)?{
?4?
?5?????return?{
?6?????????alert:?function(text)?{
?7?????????????$window.alert(text);
?8?????????}
?9?????};}]);
10?
11?var?myController?=?function($scope,?$alert)?{
12?????$scope.message?=?function(msg)?{
13?????????console.log(msg);
14?????????$alert.alert(msg);
15?????};
16?};
17?myController.$inject?=?['$scope',?'$alert'];
18?myModule.controller("myController",?myController);?

?

jsfiddle在線演示http://jsfiddle.net/whitewolf/zyA5B/8/

3:內聯注入:對于directives,factory,filter等特殊指令使用$inject標注注入使用不是那么友好,angularjs特別增加了內聯注入。如上面的$alert服務?????

1?myModule.factory('$alert',?['$window',?function($window)?{?
2?
3????return?{?
4????????alert:?function(text)?{?
5????????$window.alert(text);?
6?????}?
7?};}]);

?

?? 在angularjs中我們可以在controller中實用DI特性,同時一些列的工廠方法如directives, services, filters同樣可以實用內聯注入得到DI特性。

1:在controller中形如:

?1?var?MyController?=?function(dep1,?dep2)?{
?2?
?3?...
?4?
?5?}
?6?
?7?MyController.$inject?=?['dep1',?'dep2'];
?8?
?9??
10?
11?MyController.prototype.aMethod?=?function()?{
12?
13?...
14?
15?}

???

2:工廠方法注入形如:

?1?angualar.module('myModule',?[]).
?2?
?3?config(['depProvider',?function(depProvider){
?4?
?5?...
?6?
?7?}]).
?8?
?9?factory('serviceId',?['depService',?function(depService)?{
10?
11?...
12?
13?}]).
14?
15?directive('directiveName',?['depService',?function(depService)?{
16?
17?...
18?
19?}]).
20?
21?filter('filterName',?['depService',?function(depService)?{
22?
23?...
24?
25?}]).
26?
27?run(['depService',?function(depService)?{
28?
29?...
30?
31?}]);

?

轉載于:https://www.cnblogs.com/whitewolf/archive/2012/09/11/2680659.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/379312.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379312.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379312.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Access sql語句創建表及字段類型

Create TABLE 測試表 ( 文本255 VARCHAR NOT NULL, 文本20 VARCHAR(20) NOT NULL, 日期時間 DATETIME, 數字1 BYTE, 數字2 SMALLINT, 數字4 INTEGER, 布爾 BIT, 自動編號 COUNTER(10, 5) CONSTRAINT PK_TVIPLevel26 PRIMARY KEY, 小數 NUME…

c語言getc函數_C語言中的getc()函數與示例

c語言getc函數C語言中的getc()函數 (getc() function in C) Prototype: 原型: int getc(FILE *filename);Parameters: 參數: FILE *filenameReturn type: int 返回類型: int Use of function: 使用功能: In the file handling…

匯編語言-015(PROC偽指令定義參數方式、EXTERNDEF、INCLUDE 、EXTERN 、INVOKE、PROC、PROTO 、MOVSB 、MOVSD 、CMPSD )

1:使用PROC偽指令定義參數方式不通過寄存器傳參,計算數組之和 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data array DWORD 10000h,20000h,30000h,40000h,50000h theSum DWORD ?.code ArraySum PROC USES esi ecx,ptr…

編寫計算表達式(X-Y+25)/Z的值得程序,要求將其商和余數分別放在A、B單元中。(設X和Y是32位無符號數,A、B和Z是16位無符號數,不考慮溢出情況。)

編寫計算表達式(X-Y25)/Z的值得程序,要求將其商和余數分別放在A、B單元中。(設X和Y是32位無符號數,A、B和Z是16位無符號數,不考慮溢出情況。) P151 例4.8 匯編思路:首先在DATA段定…

《深入淺出WPF》筆記——綁定篇(一)

上一節,有記錄寫到:在WPF里,數據驅動UI,數據占核心地位,UI次之。怎么恢復數據的核心地位,那就要先了解一下Binding。 一、Binding 基礎 1.1WPF中Data Binding的帶來的方便 在設計架構的時間,大家…

你的代碼完成了嗎?(之二)——可維護性和規范性

二. 可維護性和規范性 對于代碼來說,這兩個屬性其實是緊密相連的。什么樣的代碼最好維護呢?當然是規范的代碼了。再差的規范也要比沒有規范強得多。 之前做對日項目的時候,日本人對于“規范”這個東西(他們稱之為開發規約&#xf…

c語言feof函數_使用示例的C語言中的feof()函數

c語言feof函數C語言中的feof()函數 (feof() function in C) Prototype: 原型: int feof(FILE* filename);Parameters: 參數: FILE *filenameReturn type: int(0 or 1) 返回類型: int(0或1) Use of function: 使用功能: In C l…

5種經典排序算法,每個程序員都應該知道

我的新書《Android App開發入門與實戰》已于2020年8月由人民郵電出版社出版,歡迎購買。點擊進入詳情 有沒有想過當您應用從低到高、從高到低或按字母順序等過濾器時,亞馬遜或任何其他電子商務網站中的產品如何排序?排序算法對于此類網站起著至…

匯編語言-016(SCASB 、STOSB 、LODSD 、數組中的取值、二維數組操作、冒泡排序和二分查找、CMPSW )

1: SCASB : (字節)將AL的值與EDI尋址的一個字比較。進行在一個字符串檢索特定的字符 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data alpha BYTE "ABCDEFGH",0.code main PROCmov edi,OFFSET alpha ;EDI指向字符串mov …

編寫一個匯編語言程序,將字符串Hello World中的全部小寫字母轉換為大寫字母,并存放回原地址處。

編寫一個匯編語言程序,將字符串"Hello World"中的全部小寫字母轉換為大寫字母,并存放回原地址處。 P176 4.10 編程思路:首先DATA段中,定義string存放字符串"Hello World",LEN為字符串string長度…

在Python中使用OpenCV(CV2)對圖像進行邊緣檢測

Modules used: 使用的模塊: For this, we will use the opencv-python module which provides us various functions to work on images. 為此,我們將使用opencv-python模塊,該模塊為我們提供了處理圖像的各種功能。 Download opencv-pytho…

需保留小數點兩位,但同時不要小數點后多余0的前后臺代碼實現

今天碰到一個需求。關于小數點的處理,看起來非常簡單的事情,卻花了一定時間做了一些試驗。最后簡單總結一下,以便備忘。 需求簡化一下表達是這樣的: 有A、B兩列,A/BC。這3列在數據庫中都以decimal存放。 在應用中&…

匯編語言-017(SCASW 、STRUCT 、STRUCT_ALLPOINTS 、STRUCT_ALIGN 、SYSTEMTIME、UNION 、 STRUCTTEST )

1:SCASW : 在wordArray中掃描16位數值0100h,將匹配元素的偏移量復制到EAX .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data wordArray WORD 0500h,0400h,0300h,0200h,0100h.code main PROCmov ax,0100hmov edi,OFFSET wordArraymov …

【筆記】正則表達式[1]

元字符 符號 意思 示范 詳例 \d 任意一個數字 \d{2}-\d{8} 22-12345678 * *前的符號重復任意次數 次數可以為零 \d* 222222222222... 或 2 \s 任意的空白符 全半角空格,tab,換行符 \bhi\b\s\bLucy\b hi Lucy 和*用法相似 次數>1 \d …

編寫一個匯編語言程序,完成以下要求。從BUF單元處定義有10個帶符號字數據:-1,3,24,94,62,72,55,0,-48,99,試找出他們中的最大值和平均值,并以此分別存放至該數據區的后兩個單元

編寫一個匯編語言程序,完成以下要求。從BUF單元處定義有10個帶符號字數據:-1,3,24,94,62,72,55,0,-48,99,試找出他們中的最大值和平均值,并以此分別存放至該數據區的后兩個單元中(假設這10個數的和值不超過16位范圍) P176 4.12 編程思路&am…

prototype 的ajax

原文:http://www.prototypejs.org/learn/introduction-to-ajax]翻 譯:www.ruby-china.cn 站長]Prototype框架提供了非常容易和有意思的方法處理Ajax的調用,同時它也是瀏 覽器安全的 。除了簡單的請求外,這個模塊(指pro…

匯編語言-018(FLD 、FST、FSTP、FCHS、FABS 、浮點運算符、浮點比較 )

1:FLD : FPU(浮點處理器)的加載浮點數到堆棧指令 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data array REAL8 10 DUP(?) dblOne REAL8 234.56 dblTwo REAL8 10.1.code main PROCfld array …

mcq 隊列_MCQ | 基礎知識 免費和開源軟件| 套裝4

mcq 隊列Q1. What do you call the technique of storing encrypted user passwords in Linux? Q1。 您如何稱呼在Linux中存儲加密的用戶密碼的技術? System Password Management 系統密碼管理 Shadow Password 影子密碼 Encrypted Password 加密密碼 None of the…

將AX寄存器中的16位數據分成4組(從高到低),每組4位,然后把這4組數作為數當中的低4位分別放在AL,BL,CL,DL中。

將AX寄存器中的16位數據分成4組(從高到低),每組4位,然后把這4組數作為數當中的低4位分別放在AL,BL,CL,DL中。 P176 4.14 編程思路:首先用BX、DX存放AX,即原AX原BX原DX&…

一個很不錯的wp企業站模板

http://zjuhpp.com/chinese-localization-of-business-wordpress-theme-devster.html轉載于:https://www.cnblogs.com/i-kyle/archive/2012/09/13/2683817.html