angular五种服务

一.constant服务:

app.constant("name",obj)

name为服务的名字,obj为一个json对象.

js:

serviceApp.constant("myConfig",{ 

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

  }});

二.value服务:

app.value("name",obj)

name为服务的名字,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创建服务返回一个json对象(也就是第二个参数中传入的对象),这个对象里可以有参数,可以有方法,并且,属性和方法都可以在控制器中修改,新增,按照它的设计本意,如果属性和方法需要被修改内容,就用value来创建服务.

constant和value主要就是用于存放一些数据或方法以供使用,区别是constant一般是存放固定内容,value存放可能会被修改的内容

注意点:

1.同constant注意点1

2.同constant注意点2

3.value可以被装饰,所以这里myConfig服务拥有了money属性.(装饰具体怎么用,下面会说)

三.factory服务

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

name为服务的名字,第二个参数传入一个函数,函数需要有一个返回值obj,返回一个对象.实际被注入的服务就是这个对象.

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

})});

运行结果:

说明:

factory服务是最常见最常用的服务类型,几乎可以满足90%的自己开发的需求,使用它可以编写一些逻辑,通过这些逻辑最后返回所需要的对象.比如使用$http来获取一些数据.我们就在factory创建的服务里抓取数据,最后返回.

它和constant,value最大的区别是,factory服务是有一个处理过程,经过这个过程,才返回结果的.

注意点:

1.同constant注意点1

2.同constant注意点2

3.factory返回的服务也可以被装饰,所以这里myConfig服务拥有了money属性.(装饰具体怎么用,下面会说)

四.service服务

app.service("name",constructor)

name为服务的名字,constructor是一个构造函数.

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    }}

装饰部分代码同上.

运行结果:

http://jsfiddle.net/1qj8m5ot/

http://jsfiddle.net/0bh67cog/

说明:

service和factory的区别在于,它第二个参数传入的是一个构造函数,最后被注入的服务是这个构造函数实例化以后的结果.所以基本上使用service创建的服务的,也都可以使用factory来创建.

所以这里,factory服务的第二种写法和使用service是一致的:

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

注意点:

1.同constant注意点1

2.同constant注意点2

3.service返回的服务也可以被装饰,所以这里myConfig服务拥有了money属性.(装饰具体怎么用,下面会说)

五.provider服务

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

name为服务的名字,第二个参数接受一个函数,函数返回一个对象,返回的对象比如要有$get方法,$get方法必须要返回一个对象obj,这个对象就是真正被注入的服务.

栗子一:

js:

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

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

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

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

装饰部分代码同上.

运行结果: http://jsfiddle.net/2pz2ft73/

说明:

provider服务的第二个参数的返回值中必须要有$get方法(除了$get,还可以有其它方法,后面的例子会说到),$get方法就相当于factory服务的第二个参数,最后要返回一个对象,这个对象就是真正被注入的服务:

栗子二:

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)});

装饰部分代码同上.

运行结果:http://jsfiddle.net/hcpemex3/

说明:

这里的provider服务不仅仅返回了$get方法,还返回了setID方法,然后id变量是写在函数里的,返回值的外面,形成一个闭包,可以被修改.

然后,在provider服务里定义的方法,可以在config函数里调用.注意调用的格式:

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

被注入的服务名不叫myConfig,而是myConfigProvider.然后在函数里面可以调用myConfigProvider的setID方法(也就是myConfig的setID方法).

通过这种方式,使得我们的服务可以被手动配置,比如这里可以配置id.

ng有很多内置的服务都有这样的功能,比如$route服务,$location服务,当我们通过$routeProvider和$locationProvider来配置的时候,其本质就是这些服务是通过provider创建的.

注意点:

1.同constant注意点1

2.同constant注意点2

3.provider返回的服务也可以被装饰,所以这里myConfig服务拥有了money属性.(装饰具体怎么用,下面会说);

六.装饰服务

其实通过上面这么多的例子,看也能看懂装饰是什么了...

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

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

同样是通过config,在参数函数中注入$provider服务,$provider服务有个decorator方法,它接受两个参数,第一个参数"name",是要被装饰的服务的名字,第二个参数是一个函数,函数中注入$delegate,$delegate就是被装饰的服务的实例,然后在函数中操作$delegate,就相当于操作了该服务的实例.

注意:

1.最后一定要return $delegate,这样服务才算被装饰完成了.

2.constant服务是不能被装饰的.

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

总结上面的内容:

1.服务的实例被注入到控制器以后,都是一个引用对象,无论被注入多少个控制器中,实际都指向同一个对象,所以,无论修改其中的哪一个,其它所有的服务都会被改变.

2.服务的实例被修改过后,ng不会自动同步,需要使用$scope.$watch()监测其变化并手动刷新视图.

3.constant服务不能通过decorator进行装饰.

4.一些固定的参数和方法,使用constant

5.可能被修改的参数和方法,使用value

6.通过逻辑处理后得到的参数或方法,使用factory

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

8.可以手动配置参数的服务,使用provider

七.可以创建不同实例的服务

之前我们说到,所有的服务的实例都是引用对象,无论被注入多少个控制器中,实际都指向同一个对象,所以,无论修改其中的哪一个,其它所有的服务都会被改变.这就是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;});});/************************创建实例的服务************************/serviceApp.factory("myConfig",function(){return{//服务返回的对象有一个create方法,该方法每次被执行都会返回一个新的constructorFun实例create:

constructorFun.createNew

}});//创建一个构造函数functionconstructorFun(){varmyname = "code_bunny";varage =

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

id}//给构造函数添加createNew方法,用于实例化一个constructorFun.constructorFun.createNew

=function(){returnnewconstructorFun()};//给构造函数添加原型的方法.使得它的实例可以继承.constructorFun.prototype

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,667评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,361评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,700评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,027评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,988评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,230评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,705评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,366评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,496评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,405评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,453评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,725评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,803评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,015评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,514评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,111评论 2 341

推荐阅读更多精彩内容

  • 1、angularjs的几大特性是什么? 双向数据绑定、依赖注入、模板、指令、MVC/MVVM 2、列举几种常见的...
    2e9a10d418ab阅读 1,248评论 0 10
  • 1、angularjs的几大特性是什么? 双向数据绑定、依赖注入、模板、指令、MVC/MVVM 2、列举几种常见的...
    秀才JaneBook阅读 1,536评论 0 22
  • AngularJS是什么?AngularJs(后面就简称ng了)是一个用于设计动态web应用的结构框架。首先,它是...
    200813阅读 1,583评论 0 3
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • Angular面试题 一、ng-show/ng-hide与ng-if的区别? 第一点区别是,ng-if在后面表达式...
    w_zhuan阅读 5,504评论 0 26