AngularJS核心概念

1.MVC思想
2.依賴注入DI
3.數(shù)據(jù)綁定
4.模塊化Modules
5.服務(wù)Service
6.過濾器Filter
7.指令Directive
8.測試(Unit Testing & E2E Testing)

(一)MVC思想
MVC(Model View Controller)是一種架構(gòu)設(shè)計模式硼补。模型結(jié)構(gòu)如下圖所示:

MVC結(jié)構(gòu).png

view:視圖(用戶界面)
controller:控制器(業(yè)務(wù)邏輯)
model:模型(數(shù)據(jù)存儲)

MVC架構(gòu)中,所有通信都是單向的霉赡。
1)view傳送指令到controller绘趋;
2)controller完成業(yè)務(wù)邏輯后颤陶,model改變狀態(tài);
3)model將更新后的數(shù)據(jù)發(fā)送到view陷遮,用戶得到反饋滓走。

(二)依賴注入DI
控制反轉(zhuǎn)IOC與依賴注入DI:
IOC:一種面向?qū)ο蟮脑O(shè)計原則,用來降低代碼之間的耦合度帽馋。借助IOC容器實(shí)現(xiàn)具有依賴關(guān)系的對象之間的解耦搅方。全部對象的控制權(quán)交給IOC容器,IOC容器是整個系統(tǒng)的關(guān)鍵核心绽族,起到“粘合劑”的作用姨涡。
DI:依賴注入就是將實(shí)例變量傳入到一個對象中去。

IOC是一種思想吧慢,DI是一種設(shè)計模式涛漂。

(三)數(shù)據(jù)綁定
AngularJS采用雙向數(shù)據(jù)綁定,意味著如果視圖改變了某個值检诗,數(shù)據(jù)模型會通過臟檢查觀察到這個變化匈仗,而如果數(shù)據(jù)模型改變了某個值底哗,視圖也會依據(jù)變化重新渲染。
AngularJS會記錄數(shù)據(jù)模型所包含的數(shù)據(jù)在任何特定時間點(diǎn)的值锚沸,而不是原始值跋选。當(dāng)AngularJS認(rèn)為某個值可能發(fā)生變化時,它會運(yùn)行自己的事件循環(huán)來檢查這個值是否變“臟”哗蜈。如果該值從上次事件循環(huán)運(yùn)行之后發(fā)生了變化前标,則該值被認(rèn)為是“臟”值。這也是Angular可以追蹤和響應(yīng)應(yīng)用變化的方式距潘。這個過程被稱作“臟檢查”炼列。臟檢查是檢查數(shù)據(jù)模型的變化的有效手段,當(dāng)有潛在的變化存在時音比,AngularJS會在事件循環(huán)時執(zhí)行臟檢查來保證數(shù)據(jù)的一致性俭尖。
借助AngularJS,不需要構(gòu)建復(fù)雜和新的JavaScript功能洞翩,就可以在視圖中實(shí)現(xiàn)類自動同步的機(jī)制稽犁。

(四)模塊化Modules
在使用JQuery和原生JS時,我們常常使用模塊來避免函數(shù)污染全局骚亿。
在Angular中已亥,模塊不只是為了解決全局函數(shù)的問題,還相當(dāng)于一個namespace或者package来屠,表示的是一堆功能單元的集合虑椎。Angular應(yīng)用沒有主方法,而是使用模塊來聲明應(yīng)用應(yīng)該如何啟動俱笛。

根據(jù)Angular官方文檔捆姜,模塊化有以下優(yōu)勢:

    啟動過程是聲明式的,所以更容易懂迎膜;
    在單元測試時泥技,不需要加載全部模塊,因此這種方式有利于單元測試的代碼書寫星虹;
    在場景測試中零抬,額外的模塊可以被加載進(jìn)來,進(jìn)而重寫一些配置宽涌,這樣有助于實(shí)現(xiàn)應(yīng)用的端到端的測試叉抡;
    第三方代碼可以打包成可重用的模塊偿荷;
    模塊可以以任何先后或者并行的順序加載(因?yàn)槟K的執(zhí)行本身是延遲的)。

對于大型應(yīng)用,根據(jù)不同職責(zé)条舔,建議把它像這樣分成多個模塊:

    一個服務(wù)模塊,用來做服務(wù)的聲明;
    一個指令模塊,用來做指令的聲明;
    一個過濾器模塊,用來做過濾器聲明;
    一個依賴以上模塊的應(yīng)用級模塊吃溅,它包含初始化代碼。

這樣拆分的原因是鸯檬,在你的測試中常常需要忽略掉初始化代碼决侈,因?yàn)檫@些代碼比較難測試。通過把它拆分出來就能在測試中方便地忽視掉它喧务。通過只加載和當(dāng)前測試相關(guān)的模塊赖歌,也能使測試更專一。

模塊依賴
模塊聲明時可以列出它所需要依賴的其它模塊功茴。一個模塊依賴某模塊庐冯,意味著這個被依賴的模塊需要在模塊被加載之前加載完畢。更具體些坎穿,假設(shè)模塊A依賴于模塊B展父,那么模塊A的配置代碼塊的執(zhí)行,必須發(fā)生在模塊B的配置代碼塊之后玲昧;模塊A的執(zhí)行代碼塊亦同理栖茉,也在模塊B的執(zhí)行代碼塊之后被執(zhí)行。每個模塊只能被加載一次酌呆,即使有多個別的模塊依賴它衡载。

創(chuàng)建模塊,獲取模塊隙袁,如何實(shí)現(xiàn)模塊的依賴
使用 angular.module(‘myModule’, []) 將創(chuàng)建名為 myModule 的模塊并重寫已有的同名模塊。而使用 angular.module(‘myModule’) 則只會獲取已有的模塊實(shí)例弃榨。
模塊創(chuàng)建和獲取的區(qū)別菩收,在于module函數(shù)的第二參數(shù),該參數(shù)的作用是定義創(chuàng)建模塊時的所依賴的模塊(子模塊)鲸睛。
這樣做的好處是娜饵,不同的服務(wù)或者一組服務(wù)被放置在不同的可重用模塊,那么應(yīng)用模塊只需要聲明應(yīng)用所需要的全部依賴模塊即可官辈。

(五)服務(wù)Service
服務(wù)提供了一種能在應(yīng)用的整個生命周期內(nèi)保持?jǐn)?shù)據(jù)的方法箱舞,它能夠在控制器之間進(jìn)行通信,并且能保證數(shù)據(jù)的一致性拳亿。
服務(wù)是一個單例對象晴股,在每個應(yīng)用中只會被實(shí)例化一次,并且是延遲加載的(需要時才會被創(chuàng)建)肺魁。服務(wù)提供了把與特定功能相關(guān)聯(lián)的方法集中在一起的接口电湘。
AngularJS提供了一些內(nèi)置服務(wù),在任何地方使用它們的方式都是統(tǒng)一的。同時寂呛,為復(fù)雜應(yīng)用創(chuàng)建我們自己的服務(wù)也是非常有用的怎诫。
在AngularJS中創(chuàng)建自己的服務(wù)是非常容易的,只需要注冊這個服務(wù)即可贷痪。服務(wù)被注冊后幻妓,AngularJS編譯器就可以引用它,并且在運(yùn)行時把它當(dāng)作依賴加載進(jìn)來劫拢。服務(wù)名稱的注冊表使得在在測試中偽造和剔除相互隔離的應(yīng)用依賴變得非常容易肉津。

(六)過濾器Filter
過濾器(filter)的作用就是接收一個輸入,通過某個規(guī)則進(jìn)行處理尚镰,然后返回處理后的結(jié)果阀圾。主要用在數(shù)據(jù)的格式化上,例如獲取一個數(shù)組中的子集狗唉,對數(shù)組中的元素進(jìn)行排序等初烘。
AngularJS內(nèi)置了一些過濾器,它們是:currency(貨幣)分俯、date(日期)肾筐、filter(子串匹配)、json(格式化json對象)缸剪、limitTo(限制個數(shù))吗铐、lowercase(小寫)、uppercase(大寫)杏节、number(數(shù)字)唬渗、orderBy(排序),總共九種。
除此之外還可以自定義過濾器奋渔,可以滿足任何要求的數(shù)據(jù)處理镊逝。filter的自定義方式也很簡單,使用module的filter方法嫉鲸,返回一個函數(shù)撑蒜,該函數(shù)接收輸入值,并返回處理后的結(jié)果玄渗。

(七)指令Directive
AngularJS 通過被稱為 指令 的新屬性來擴(kuò)展 HTML座菠,通過內(nèi)置的指令來為應(yīng)用添加功能,并且允許自定義指令藤树。
ng-app 指令初始化一個 AngularJS 應(yīng)用程序浴滴。
ng-init 指令初始化應(yīng)用程序數(shù)據(jù)。
ng-model 指令把元素值(比如輸入域的值)綁定到應(yīng)用程序也榄。

(八)測試(Unit Testing & E2E Testing)
1)單元測試Unit Testing
我們可以專注于構(gòu)建我們的測試來隔離具體巡莹、單獨(dú)組件的代碼司志。這種方法被稱為“單元測試”,在不同階段降宅、不同條件下骂远、以不同的輸入來測試各種特定單元的代碼。
單元測試專門用于測試小型腰根、獨(dú)立的代碼單元激才,單個函數(shù),或者較小的帶有功能的交互额嘿。
單元測試的麻煩在于把邏輯隔離成小塊瘸恼,這樣我們才能測試它。
2)端到端測試E2E Testing
對應(yīng)于進(jìn)行端到端測試册养,也即黑盒測試东帅。在端到端測試中,我們測試應(yīng)用的視角是:作為最終用戶球拦,對系統(tǒng)的底層實(shí)現(xiàn)一無所知靠闭。這種方法非常適合測試大型應(yīng)用的功能。
端到端測試適合測試頁面上的用戶交互坎炼,無需手動刷新頁面愧膀。端到端測試意義重大,因?yàn)樗成淞擞脩粼谑褂梦覀儜?yīng)用時的真實(shí)體驗(yàn)谣光。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末檩淋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子萄金,更是在濱河造成了極大的恐慌蟀悦,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氧敢,死亡現(xiàn)場離奇詭異熬芜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)福稳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瑞侮,“玉大人的圆,你說我怎么就攤上這事“牖穑” “怎么了越妈?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長钮糖。 經(jīng)常有香客問我梅掠,道長酌住,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任阎抒,我火速辦了婚禮酪我,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘且叁。我一直安慰自己都哭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布逞带。 她就那樣靜靜地躺著欺矫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪展氓。 梳的紋絲不亂的頭發(fā)上穆趴,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音遇汞,去河邊找鬼未妹。 笑死,一個胖子當(dāng)著我的面吹牛勺疼,可吹牛的內(nèi)容都是我干的教寂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼执庐,長吁一口氣:“原來是場噩夢啊……” “哼酪耕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起轨淌,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤迂烁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后递鹉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盟步,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年躏结,在試婚紗的時候發(fā)現(xiàn)自己被綠了却盘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡媳拴,死狀恐怖黄橘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情屈溉,我是刑警寧澤塞关,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站子巾,受9級特大地震影響帆赢,放射性物質(zhì)發(fā)生泄漏小压。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一椰于、第九天 我趴在偏房一處隱蔽的房頂上張望怠益。 院中可真熱鬧,春花似錦廉羔、人聲如沸溉痢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孩饼。三九已至,卻和暖如春竹挡,著一層夾襖步出監(jiān)牢的瞬間镀娶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工揪罕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梯码,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓好啰,卻偏偏與公主長得像轩娶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子框往,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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