angular五種服務(wù)

一.constant服務(wù):

app.constant("name",obj)

name為服務(wù)的名字,obj為一個json對象.

js:

serviceApp.constant("myConfig",{?

? name:"code_bunny",? ? age:12,? ? getId:function(){return1?

? }});

二.value服務(wù):

app.value("name",obj)

name為服務(wù)的名字,obj為一個json對象.

js:

serviceApp.value("myConfig",{? ? name:"code_bunny",? ? age:12,? ? getId:function(){return1? ? }});

serviceApp.config(function($provide){

$provide.decorator("myConfig",function($delegate){

$delegate.money = "100w";return$delegate? ? })});

說明:

value創(chuàng)建服務(wù)返回一個json對象(也就是第二個參數(shù)中傳入的對象),這個對象里可以有參數(shù),可以有方法,并且,屬性和方法都可以在控制器中修改,新增,按照它的設(shè)計本意,如果屬性和方法需要被修改內(nèi)容,就用value來創(chuàng)建服務(wù).

constant和value主要就是用于存放一些數(shù)據(jù)或方法以供使用,區(qū)別是constant一般是存放固定內(nèi)容,value存放可能會被修改的內(nèi)容

注意點:

1.同constant注意點1

2.同constant注意點2

3.value可以被裝飾,所以這里myConfig服務(wù)擁有了money屬性.(裝飾具體怎么用,下面會說)

三.factory服務(wù)

app.factory("name",function(){returnobj})

name為服務(wù)的名字,第二個參數(shù)傳入一個函數(shù),函數(shù)需要有一個返回值obj,返回一個對象.實際被注入的服務(wù)就是這個對象.

js:

serviceApp.factory("myConfig",function(){varmyname

= "code_bunny";varage = 12;varid = 1;return{? ?

? ? name: myname,

age: age,? ? ? ? getId:function(){returnid? ? ? ? }? ? }});

或者是這樣:

serviceApp.factory("myConfig",function(){returnnewconstructorFun()});functionconstructorFun(){varmyname

= "code_bunny";varage = 12;varid = 1;this.name = myname;this.age =

age;this.getId =function(){returnid? ? }}

裝飾部分代碼:

serviceApp.config(function($provide){

$provide.decorator("myConfig",function($delegate){

console.log($delegate);? ? ? ? $delegate.money = "100w";return$delegate

})});

運行結(jié)果:

說明:

factory服務(wù)是最常見最常用的服務(wù)類型,幾乎可以滿足90%的自己開發(fā)的需求,使用它可以編寫一些邏輯,通過這些邏輯最后返回所需要的對象.比如使用$http來獲取一些數(shù)據(jù).我們就在factory創(chuàng)建的服務(wù)里抓取數(shù)據(jù),最后返回.

它和constant,value最大的區(qū)別是,factory服務(wù)是有一個處理過程,經(jīng)過這個過程,才返回結(jié)果的.

注意點:

1.同constant注意點1

2.同constant注意點2

3.factory返回的服務(wù)也可以被裝飾,所以這里myConfig服務(wù)擁有了money屬性.(裝飾具體怎么用,下面會說)

四.service服務(wù)

app.service("name",constructor)

name為服務(wù)的名字,constructor是一個構(gòu)造函數(shù).

js:

serviceApp.service("myConfig",function(){varmyname

= "code_bunny";varage = 12;varid = 1;this.name = myname;this.age =

age;this.getId =function(){returnid? ? }});

或者是這樣:

serviceApp.service("myConfig",constructorFun);functionconstructorFun(){varmyname

= "code_bunny";varage = 12;varid = 1;this.name = myname;this.age =

age;this.getId =function(){returnid? ? }}

裝飾部分代碼同上.

運行結(jié)果:

http://jsfiddle.net/1qj8m5ot/

http://jsfiddle.net/0bh67cog/

說明:

service和factory的區(qū)別在于,它第二個參數(shù)傳入的是一個構(gòu)造函數(shù),最后被注入的服務(wù)是這個構(gòu)造函數(shù)實例化以后的結(jié)果.所以基本上使用service創(chuàng)建的服務(wù)的,也都可以使用factory來創(chuàng)建.

所以這里,factory服務(wù)的第二種寫法和使用service是一致的:

serviceApp.factory("myConfig",function(){returnnewconstructorFun()});//等價于serviceApp.service("myConfig",constructorFun);

注意點:

1.同constant注意點1

2.同constant注意點2

3.service返回的服務(wù)也可以被裝飾,所以這里myConfig服務(wù)擁有了money屬性.(裝飾具體怎么用,下面會說)

五.provider服務(wù)

app.provider("name",function(){  ....return{    ...    $get:function(){      ...returnobj}? ?? }})

name為服務(wù)的名字,第二個參數(shù)接受一個函數(shù),函數(shù)返回一個對象,返回的對象比如要有$get方法,$get方法必須要返回一個對象obj,這個對象就是真正被注入的服務(wù).

栗子一:

js:

serviceApp.provider("myConfig",function(){return{

$get:function(){varmyname = "code_bunny";varage = 12;varid =

1;return{? ? ? ? ? ? ?? name: myname,? ? ? ? ? ? ?? age: age,

getId:function(){returnid? ? ? ? ? ? ?? }? ? ? ? ?? }? ? ?? }?? }});

裝飾部分代碼同上.

運行結(jié)果:?http://jsfiddle.net/2pz2ft73/

說明:

provider服務(wù)的第二個參數(shù)的返回值中必須要有$get方法(除了$get,還可以有其它方法,后面的例子會說到),$get方法就相當于factory服務(wù)的第二個參數(shù),最后要返回一個對象,這個對象就是真正被注入的服務(wù):

栗子二:

js:

serviceApp.provider("myConfig",function(){varid

= 1;return{? ? ? ? setID:function(newID){? ? ? ? ? ? id = newID

},? ? ? ? $get:function(){varmyname = "code_bunny";varage = 12;return{

name: myname,? ? ? ? ? ? ? ? age: age,

getId:function(){returnid? ? ? ? ? ? ? ? }? ? ? ? ? ? }? ? ? ? }

}});serviceApp.config(function(myConfigProvider){

myConfigProvider.setID(2)});

裝飾部分代碼同上.

運行結(jié)果:http://jsfiddle.net/hcpemex3/

說明:

這里的provider服務(wù)不僅僅返回了$get方法,還返回了setID方法,然后id變量是寫在函數(shù)里的,返回值的外面,形成一個閉包,可以被修改.

然后,在provider服務(wù)里定義的方法,可以在config函數(shù)里調(diào)用.注意調(diào)用的格式:

serviceApp.config(function(myConfigProvider){? ? myConfigProvider.setID(2)});

被注入的服務(wù)名不叫myConfig,而是myConfigProvider.然后在函數(shù)里面可以調(diào)用myConfigProvider的setID方法(也就是myConfig的setID方法).

通過這種方式,使得我們的服務(wù)可以被手動配置,比如這里可以配置id.

ng有很多內(nèi)置的服務(wù)都有這樣的功能,比如$route服務(wù),$location服務(wù),當我們通過$routeProvider和$locationProvider來配置的時候,其本質(zhì)就是這些服務(wù)是通過provider創(chuàng)建的.

注意點:

1.同constant注意點1

2.同constant注意點2

3.provider返回的服務(wù)也可以被裝飾,所以這里myConfig服務(wù)擁有了money屬性.(裝飾具體怎么用,下面會說);

六.裝飾服務(wù)

其實通過上面這么多的例子,看也能看懂裝飾是什么了...

app.config(function($provide){$provide.decorator("name",function($delegate){

$delegate.money = "100w";return$delegate})});

同樣是通過config,在參數(shù)函數(shù)中注入$provider服務(wù),$provider服務(wù)有個decorator方法,它接受兩個參數(shù),第一個參數(shù)"name",是要被裝飾的服務(wù)的名字,第二個參數(shù)是一個函數(shù),函數(shù)中注入$delegate,$delegate就是被裝飾的服務(wù)的實例,然后在函數(shù)中操作$delegate,就相當于操作了該服務(wù)的實例.

注意:

1.最后一定要return $delegate,這樣服務(wù)才算被裝飾完成了.

2.constant服務(wù)是不能被裝飾的.

栗子就不說了吧,上面的都是~

總結(jié)上面的內(nèi)容:

1.服務(wù)的實例被注入到控制器以后,都是一個引用對象,無論被注入多少個控制器中,實際都指向同一個對象,所以,無論修改其中的哪一個,其它所有的服務(wù)都會被改變.

2.服務(wù)的實例被修改過后,ng不會自動同步,需要使用$scope.$watch()監(jiān)測其變化并手動刷新視圖.

3.constant服務(wù)不能通過decorator進行裝飾.

4.一些固定的參數(shù)和方法,使用constant

5.可能被修改的參數(shù)和方法,使用value

6.通過邏輯處理后得到的參數(shù)或方法,使用factory

7.可以使用factory的也可以使用service,反之亦然(一般就是用factory)

8.可以手動配置參數(shù)的服務(wù),使用provider

七.可以創(chuàng)建不同實例的服務(wù)

之前我們說到,所有的服務(wù)的實例都是引用對象,無論被注入多少個控制器中,實際都指向同一個對象,所以,無論修改其中的哪一個,其它所有的服務(wù)都會被改變.這就是ng服務(wù)的設(shè)計模式,一般不需要去改變,但如果有特殊需要,要能夠每次注入控制器后得到新的實例,可以這樣做:

我們給服務(wù)添加了一個方法,每次執(zhí)行一次這個方法,都會創(chuàng)建一個新的實例,這樣,雖然在控制器里注入的是服務(wù)實例還是同一個,但是在調(diào)用創(chuàng)建實例方法的時候,都會創(chuàng)建一個新的實例,然后就可以單獨修改這個實例,而不會影響到其它控制器:如下

js:

varserviceApp

=

angular.module("serviceApp",[]);serviceApp.controller("myCtrl",function($scope,myConfig){varmyConfigConstant

= myConfig.create();? ? $scope.name = myConfigConstant.name;

$scope.age = myConfigConstant.age;

angular.extend(myConfigConstant,{love:"zxg"});? ? $scope.love =

myConfigConstant.love;? ? $scope.id = myConfigConstant.getId();

$scope.$watch(myConfigConstant.name,function(){$scope.name =

myConfigConstant.name;});? ? myConfigConstant.name =

"white_bunny";});serviceApp.controller("myOtherCtrl",function($scope,myConfig){varmyConfigConstant

= myConfig.create();? ? $scope.love = myConfigConstant.love;

$scope.name = myConfigConstant.name;

$scope.$watch(myConfigConstant.name,function(){$scope.name =

myConfigConstant.name;});});/************************創(chuàng)建實例的服務(wù)************************/serviceApp.factory("myConfig",function(){return{//服務(wù)返回的對象有一個create方法,該方法每次被執(zhí)行都會返回一個新的constructorFun實例create:

constructorFun.createNew

}});//創(chuàng)建一個構(gòu)造函數(shù)functionconstructorFun(){varmyname = "code_bunny";varage =

12;varid = 1;this.name = myname;this.age = age;this.id =

id}//給構(gòu)造函數(shù)添加createNew方法,用于實例化一個constructorFun.constructorFun.createNew

=function(){returnnewconstructorFun()};//給構(gòu)造函數(shù)添加原型的方法.使得它的實例可以繼承.constructorFun.prototype

= {? ? getId:function(){returnthis.id? ? }};

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

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

  • 1、angularjs的幾大特性是什么? 雙向數(shù)據(jù)綁定、依賴注入、模板、指令、MVC/MVVM 2、列舉幾種常見的...
    2e9a10d418ab閱讀 1,381評論 0 10
  • 1、angularjs的幾大特性是什么? 雙向數(shù)據(jù)綁定、依賴注入、模板、指令、MVC/MVVM 2、列舉幾種常見的...
    秀才JaneBook閱讀 1,555評論 0 22
  • AngularJS是什么?AngularJs(后面就簡稱ng了)是一個用于設(shè)計動態(tài)web應(yīng)用的結(jié)構(gòu)框架。首先,它是...
    200813閱讀 1,631評論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,836評論 18 139
  • Angular面試題 一、ng-show/ng-hide與ng-if的區(qū)別? 第一點區(qū)別是,ng-if在后面表達式...
    w_zhuan閱讀 5,564評論 0 26