大家應該知道椒惨,AngularJS是后端人員在工作之余發(fā)明的康谆,他主要應用了后端早就存在的分層思想嫉到。所以我們得了解下分層的作用何恶。
dao層:就是Model層,在后臺時惜辑,這一層的作用疫赎,就要是寫與數據庫交互數據的一層捧搞,在angularJS里就主要是寫ajax的。
service層:主查寫邏輯代碼的介粘,但在angularJS里也可以持久化數據(充當數據容器)晚树,以供不同的controller使用爵憎。
controller層:即控制層,在angularJS里就是寫控制器的巡雨∠控制器里盡量不要寫那些不必要的邏輯,盡量寫在service層里正蛙。
所以乒验,就有了創(chuàng)建自定義服務的幾種方式。
一狂塘、constant服務:
app.constant('name',obj)
name為服務的名字,obj為一個對象荞胡。
app.constant('APP_KEY','a1s2d3f4')
constant 用于定義常量泪漂,一旦定義就不能被改變歪泳。可以被注入到任何地方呐伞,但是不能被裝飾器(decorator)裝飾敌卓。
二冒萄、value服務:
app.value('name',obj)
name為服務的名字,obj為一個對象厦画。
與 constant 一樣,可以用來定義值。但與 constant 的區(qū)別是:可以被修改鞍历,可以被 decorator 裝飾,不能被注入到 config 中肪虎。
三劣砍、factory服務:
app.factory('name',function(){return obj})
name為服務的名字,第二個參數傳入一個函數,函數需要有一個返回值obj,返回一個對象。實際被注入的服務就是這個對象扇救。
factory服務是最常見最常用的服務類型,幾乎可以滿足90%的自己開發(fā)的需求,使用它可以編寫一些邏輯,通過這些邏輯最后返回所需要的對象. 它和constant,value最大的區(qū)別是,factory服務是有一個處理過程,經過這個過程,才返回結果的.
四、service服務
app.service('name',constructor)
name為服務的名字,constructor是一個構造函數迅腔。
service和factory的區(qū)別在于,它第二個參數傳入的是一個構造函數,最后被注入的服務是這個構造函數實例化以后的結果.所以基本上使用service創(chuàng)建的服務的,也都可以使用factory來創(chuàng)建装畅。
五、provider服務
app.factory('name',function(){})
name為服務的名字,第二個參數接受一個函數,函數由兩部分組成沧烈。第一部分的變量和函數是可以在 app.config 函數中訪問的掠兄。第二部分的變量和函數是通過 $get() 函數返回的
$get方法就相當于factory服務的第二個參數,最后要返回一個對象,這個對象就是真正被注入的服務。
怎么選擇這些服務的使用?
一些固定的參數和方法,使用constant
可能被修改的參數和方法,使用value
通過邏輯處理后得到的參數或方法,使用factory
可以使用factory的也可以使用service,反之亦然(一般就是用factory)
可以手動配置參數的服務,使用provider
decorator是什么蚂夕?
decorator比較特殊迅诬,它不是 provider 。它是$provider服務的一種方法,它是用來裝飾其他 provider 的婿牍,不過 constant 除外
它接受兩個參數,第一個參數'name',是要被裝飾的服務的名字,第二個參數是一個函數,函數中注入$delegate,$delegate就是被裝飾的服務的實例,然后在函數中操作$delegate,就相當于操作了該服務的實例.
參考文獻:
AngularJS中的Provider們:Service和Factory等的區(qū)別:
拓展思考:
config和run是做什么的侈贷?
AngularJS 運行應用的兩個階段。config 階段是設置任何的 provider 的階段等脂。也是設置任何的指令俏蛮,控制器,過濾器以及其它東西的階段上遥。在 run 階段嫁蛇,AngularJS 會編譯你的 DOM 并啟動應用。
服務的本質和調用方法
從代碼層面來看露该,服務其實一個單例(可以是任何類型)睬棚,被所有的調用者所共享(在一個angular應用生命周期內,它只會被初始化一次)解幼。通過依賴注入調用抑党。?
為什么constant不能被裝飾?
constant不是被provider創(chuàng)建的