AngularJS中的provider,factory,service方法

使用$provide中的provider方法定义服务

       前面已经知道了module的定义为angular.module(name,[requires],configFn);configFn参数是配置服务的。ng供服务的过程涉及它的依赖注入机制。AngularJS是用$provider对象来实现自动依赖注入机制的。$provide.provider是一种定义服务的方法。注入机制通过调用provider的$get方法,把得到的对象作为参数进行相关的调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!DOCTYPE html>
< html  ng-app = "app" >
 
< head >
     < meta  charset = "utf-8" >
</ head >
 
< body  ng-app = "app" >
     < div  ng-controller = "Controller1" ></ div >
     < script  src = "http://cdn.bootcss.com/angular.js/1.4.1/angular.js" ></ script >
     < script  type = "text/javascript" >
     angular.module('app', [], function($provide) {
         //自定义服务
         $provide.provider('helloService', function() {
             this.$get = function() {
                 return {
                     message: 'how are you ?'
                 }
             }
         });
     })
 
     .controller('Controller1', function($scope, helloService) {
         console.log(helloService);
     });
     </ script >
</ body >
 
</ html >

        定义了名字叫helloService的服务,通过$get方法,让helloService就等于$get返回的对象。在控制器Controller1中,用到了helloService这个服务,就将它写在参数列表里。这里可以看出$scope也是一个服务。在控制台打印出helloService,结果如下:

wKioL1WOW9GhqHePAABn47kDtaY009.jpg

        上面这种方法一般不会用,因为有更加简便的方法,比如$provide里的factory和service方法。


$provide中的factory和service方法

       factory方法和service方法可以看作是provider方法的简写,它们省去了写$get方法,具体用法如下:

factory方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!DOCTYPE html>
< html  ng-app = "app" >
 
< head >
     < meta  charset = "utf-8" >
</ head >
 
< body  ng-app = "app" >
     < div  ng-controller = "Controller1" ></ div >
     < script  src = "http://cdn.bootcss.com/angular.js/1.4.1/angular.js" ></ script >
     < script  type = "text/javascript" >
     angular.module('app', [], function($provide) {
         $provide.factory('myFactory', function() {
             return 'i am factory'
         });
     })
 
     .controller('Controller1', function($scope, myFactory) {
         console.log(myFactory);
     });
     </ script >
</ body >
 
</ html >

        对factory方法来说,返回可以是任意类型,所以这里返回字符串是没有问题的。

wKiom1WOX2KB2WEFAABkaqd0IyE432.jpg


service方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!DOCTYPE html>
< html  ng-app = "app" >
 
< head >
     < meta  charset = "utf-8" >
</ head >
 
< body  ng-app = "app" >
     < div  ng-controller = "Controller1" ></ div >
     < script  src = "http://cdn.bootcss.com/angular.js/1.4.1/angular.js" ></ script >
     < script  type = "text/javascript" >
     angular.module('app', [], function($provide) {
         $provide.service('mySerivce', function() {
             return {
                 message: 'i am service'
             }
         });
     })
 
     .controller('Controller1', function($scope, mySerivce) {
         console.log(mySerivce);
     });
     </ script >
</ body >
 
</ html >

       service方法返回的只能是引用类型(数组、对象等),如果是其它类型的话会得不到内容。这一点是factory和service的区别。

wKiom1WOYHvB3CoFAAB0rD6bZ3Q336.jpg


        此外,factory和service方法在module里还有快捷方法,用法为:

1
2
3
     var module1 = angular.module('module name', ...);
     module1.factory();
     module1.service();









本文转自 iampomelo 51CTO博客,原文链接:http://blog.51cto.com/iampomelo/1666358,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值