【北京第一百零四期】angularjs中的依賴注入

1.背景介紹

今天給大家講的是angular的依賴注入片任,首先,我們要介紹一下什么是依賴注入

依賴注入蔬胯,我們打個(gè)比喻对供,以前原始社會(huì),我們需要斧子,然后由于還沒有社會(huì)分工产场,只能自己打磨一把來使用鹅髓,對應(yīng)在程序上是我們需要一個(gè)功能的時(shí)候只能自己創(chuàng)建,然后使用new等關(guān)鍵字來調(diào)用方法京景。

然后工業(yè)社會(huì)階段窿冯,我們需要使用斧子的時(shí)候,只需要找到工廠确徙,購買斧子就可以使用醒串,共產(chǎn)主義社會(huì),需要斧子的時(shí)候甚至不需要購買鄙皇,直接坐等社會(huì)提供芜赌。

依賴注入的意思就是我們需要的東西不是我們自己創(chuàng)建的,而是第三方提供的伴逸,我們只需要引用就可以使用了缠沈。

不需要的時(shí)候就不引用它。

依賴注入的優(yōu)點(diǎn):不用自己去管理眾多對象违柏,代碼耦合性低博烂,方便開發(fā);便于維護(hù)漱竖,便于模塊化測試禽篱。

2.知識剖析

依賴注入的原理:程序運(yùn)行過程中,如需另一個(gè)對象協(xié)作(調(diào)用它的方法馍惹、訪問他的屬性)時(shí)躺率,無須在代碼中創(chuàng)建被調(diào)用者,而是依賴于外部容器的注入万矾, 調(diào)用者僅通過聲明某個(gè)組件就可以獲得組件的控制權(quán)悼吱,而對該組件的依賴關(guān)系管理、查找良狈、加載由外部完成后添。

angular提供了幾種很好的依賴注入機(jī)制,以下5個(gè)核心組件用來作為依賴注入

value薪丁、factory遇西、service、provider严嗜、constant粱檀、

值工廠 ? ????? 服務(wù)提供者 ????? ?常值

值是簡單的JavaScript對象,它是用來將值傳遞過程中的配置相位控制器漫玄。

var mainApp = angular.module("mainApp", []);

//create a value object as "defaultInput" and pass it a data.

mainApp.value("defaultInput", 5);

mainApp.controller('CalcController', function($scope, CalcService, ????defaultInput) {

$scope.number = defaultInput;

$scope.result = CalcService.square($scope.number);

$scope.square = function() {

$scope.result = CalcService.square($scope.number);

}

});

工廠是用于返回函數(shù)的值茄蚯。它根據(jù)需求創(chuàng)造值,每當(dāng)一個(gè)服務(wù)或控制器需要。它通常使用一個(gè)工廠函數(shù)來計(jì)算并返回對應(yīng)值

var mainApp = angular.module("mainApp", []);

mainApp.factory('MathService', function() {

var factory = {};

factory.multiply = function(a, b) {

return a * b

}

return factory;

});

mainApp.service('CalcService', function(MathService){

this.square = function(a) {

return MathService.multiply(a,a);

}

});

提供者所使用的AngularJS內(nèi)部創(chuàng)建過程中配置階段的服務(wù)渗常,工廠等(相AngularJS引導(dǎo)自身期間)壮不。下面提到的腳本,可以用來創(chuàng)建凳谦,我們已經(jīng)在前面創(chuàng)建MathService忆畅。提供者是一個(gè)特殊的工廠方法以及get()方法,用來返回值/服務(wù)/工廠。

var mainApp = angular.module("mainApp", []);

mainApp.config(function($provide) {

$provide.provider('MathService', function() {

this.$get = function() {

var factory = {};

factory.multiply = function(a, b) {

return a * b;

}

return factory;

};

});

});

服務(wù)是一個(gè)單一的JavaScript包含了一組函數(shù)對象來執(zhí)行某些任務(wù)。服務(wù)使用service()函數(shù)轿衔,然后注入到控制器的定義雹顺。

var mainApp = angular.module("mainApp", []);

mainApp.service('CalcService', function(MathService){

this.square = function(a) {

return MathService.multiply(a,a);

}

});

mainApp.controller('CalcController', function($scope, CalcService, defaultInput) {

$scope.number = defaultInput;

$scope.result = CalcService.square($scope.number);

$scope.square = function() {

$scope.result = CalcService.square($scope.number);

}

});

3.常見問題

a、依賴注入的幾種方法如何使用

b、angular依賴注入的時(shí)候,controller里面注入的參數(shù)和function的參數(shù)列表順序問題。

4.解決方案

a 依賴注入有三種方式進(jìn)行注入:推斷式注入聲明掂之,顯式注入聲明,行內(nèi)注入聲明:

推斷式注入聲明

如果沒有明確的聲明脆丁, AngularJS會(huì)假定參數(shù)名稱就是依賴的名稱世舰。請注意,這個(gè)過程只適用于未經(jīng)過壓縮和混淆的代碼槽卫,因?yàn)锳ngularJS需要原始未經(jīng)壓縮的參數(shù)列表來進(jìn)行解析跟压。當(dāng)AngularJS實(shí)例化這個(gè)模塊時(shí),會(huì)查找greeter并自然而然地把對它的引用傳遞進(jìn)去.

顯式注入聲明

AngularJS提供了顯式的方法來明確定義一個(gè)函數(shù)在被調(diào)用時(shí)需要用到的依賴關(guān)系歼培。通過這種方法聲明依賴震蒋,即使在源代碼被壓縮、參數(shù)名稱發(fā)生改變的情況下依然能夠正常工作躲庄。我們給我們的函數(shù)設(shè)置的參數(shù)名稱分別是renamed$scope和renamedGreeter查剖,然后我們在后面使用

MyController.$inject=['$scope','greeter'];

顯式的將我們需要的依賴注入到MyController函數(shù)中;

所以在MyController函數(shù)中噪窘,renamedscope代表scope,MyController.inject=[′scope’, ‘greeter’];代表greeter

行內(nèi)注入聲明

AngularJS提供的注入聲明的最后一種方式笋庄,是可以隨時(shí)使用的行內(nèi)注入聲明。允許我們在函數(shù)定義時(shí)從行內(nèi)將參數(shù)傳入倔监。此外直砂,它可以避免在定義過程中使用臨時(shí)變量。它同前面提到的通過$inject屬性進(jìn)行注入聲明的原理是完全一樣的

b:這里需要注意的是丐枉,行內(nèi)注入聲明的時(shí)候controller和function里面的參數(shù)列表的順序是一一對應(yīng)的,否則就會(huì)注入失敗掘托,導(dǎo)致程序不執(zhí)行或者執(zhí)行失敗瘦锹。并且沒有報(bào)錯(cuò)信息。所以在一開始就需要注意這里。

5.編碼實(shí)戰(zhàn)

6.擴(kuò)展思考

Q:這些依賴組件的本質(zhì)是啥弯院?

A:factory辱士,service以及value全部都是用來定義一個(gè)provider的簡寫, 它們提供了一種方式來定義一個(gè)provider而無需輸入所有的復(fù)雜的代碼听绳。

7.參考文獻(xiàn)

參考:詳解依賴注入 ? ? ? ?參考:理解依賴注入 ? ? ? ?參考:深究依賴注入

8.更多討論

AngularJS中的依賴注入組件的應(yīng)用場景颂碘?

PPT地址


angularjs依賴注入_騰訊視頻
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市椅挣,隨后出現(xiàn)的幾起案子头岔,更是在濱河造成了極大的恐慌,老刑警劉巖鼠证,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件峡竣,死亡現(xiàn)場離奇詭異,居然都是意外死亡量九,警方通過查閱死者的電腦和手機(jī)适掰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荠列,“玉大人类浪,你說我怎么就攤上這事〖∷疲” “怎么了费就?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長锈嫩。 經(jīng)常有香客問我受楼,道長,這世上最難降的妖魔是什么呼寸? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任艳汽,我火速辦了婚禮,結(jié)果婚禮上对雪,老公的妹妹穿的比我還像新娘河狐。我一直安慰自己,他們只是感情好瑟捣,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布馋艺。 她就那樣靜靜地躺著,像睡著了一般迈套。 火紅的嫁衣襯著肌膚如雪捐祠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天桑李,我揣著相機(jī)與錄音踱蛀,去河邊找鬼窿给。 笑死,一個(gè)胖子當(dāng)著我的面吹牛率拒,可吹牛的內(nèi)容都是我干的崩泡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼猬膨,長吁一口氣:“原來是場噩夢啊……” “哼角撞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起勃痴,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谒所,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后召耘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體百炬,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年污它,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剖踊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡衫贬,死狀恐怖德澈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情固惯,我是刑警寧澤梆造,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站葬毫,受9級特大地震影響镇辉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贴捡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一忽肛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧烂斋,春花似錦屹逛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至帘瞭,卻和暖如春淑掌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蝶念。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工抛腕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诈悍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓兽埃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親适袜。 傳聞我的和親對象是個(gè)殘疾皇子柄错,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 1.背景介紹 以前原始社會(huì),我們需要斧子苦酱,然后由于還沒有社會(huì)分工售貌,只能自己打磨一把來使用,對應(yīng)在程序上是我們需要一...
    LMmx閱讀 345評論 0 2
  • 1.背景介紹 以前原始社會(huì)疫萤,我們需要斧子颂跨,然后由于還沒有社會(huì)分工,只能自己打磨一把來使用扯饶,對應(yīng)在程序上是我們需要一...
    lx2487閱讀 227評論 0 1
  • 第一期精細(xì)化管理項(xiàng)目在掌聲中落下帷幕恒削,但這并不代表著結(jié)束,而是翻開了新的篇章尾序,我們要繼續(xù)學(xué)習(xí)并結(jié)合實(shí)際钓丰,讓項(xiàng)目的成...
    內(nèi)二科鄭貝貝閱讀 770評論 1 2
  • 35. Search Insert Position 題目:https://leetcode.com/proble...
    oo上海閱讀 83評論 0 0
  • 一、刪除原有的yum rpm -aq|grep yum|xargs rpm -e –nodeps 二每币、下載yum安...
    QIAN丶AN閱讀 4,604評論 0 0