AngularJS 中的 Factory、Service以及 Provider的区别

前端之家收集整理的这篇文章主要介绍了AngularJS 中的 Factory、Service以及 Provider的区别前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

AngularJS 的供应商($provide)


$provide 服务负责告诉 AngularJS 如何创建一个新的可注入的东西: 即服务。

服务会被叫做供应商的东西来定义,可以使用 $provide 来创建一个供应商。

创建供应商的方法:

  • 使用 $provide 中的 provider() 方法来定义一个供应商;

  • 通过要求 $provide 被注入一个应用的 config 函数中来获得 $provide 服务;

定义供应商的方法


  • constant

  • value

  • service

  • factory

  • provider

  • decorator

1. constant

定义常量的,它定义的值不能被改变,它可以被注入到任何地方,但是不能被装饰器(decorator) 装饰。

DEMO:

HTML 代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3.  
  4. <head>
  5. <title>demo</title>
  6. <Meta charset="UTF-8">
  7. <Meta name="viewport" content="width=device-width,initial-scale=1">
  8. </head>
  9.  
  10. <body>
  11. <div ng-app="myApp">
  12. <div ng-controller="myController">
  13.  
  14. </div>
  15. </div>
  16. <script src="js/angular.js">
  17. </script>
  18. <script src="js/service.js"></script>
  19. </body>
  20.  
  21. </html>

JS 代码:

  1. var myApp = angular.module('myApp',[])
  2. myApp.config(function($provide) {
  3. $provide.constant('movieTitle','功夫瑜伽')
  4. })
  5. myApp.controller('myController',function(movieTitle) {
  6. console.log('movieTitle: ',movieTitle);
  7. })

语法糖:

  1. myApp.constant('movieTitle','功夫瑜伽')

2. value

它可以是 stringnumberfunction,它和 constant 的不同之处在于,它可以被修改,不能被注入到 config 中,但是它可以被 decorator 装饰。

HTML 代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3.  
  4. <head>
  5. <title>demo</title>
  6. <Meta charset="UTF-8">
  7. <Meta name="viewport" content="width=device-width,[])
  8.  
  9. myApp.config(function($provide) {
  10. $provide.value('movieTitle','功夫瑜伽')
  11. })
  12.  
  13. myApp.controller('myController',movieTitle);
  14. })

语法糖:

  1. myApp.value('movieTitle','功夫瑜伽')

3. service

它是一个可注入的构造器,在 AngularJS 中它是单例的,用它在 Controller 中通信或者共享数据都合适

  1. var myApp = angular.module('myApp',[])
  2.  
  3. myApp.config(function($provide) {
  4. $provide.service('movie',function() {
  5. this.title = '功夫瑜伽'
  6. })
  7. })
  8.  
  9. myApp.controller('myController',function(movie) {
  10. console.log('movieTitle: ',movie.title);
  11. })

语法糖:

  1. myApp.service('movie',function () {
  2. this.title = '功夫瑜伽'
  3. })

注意:

service 里面可以不用返回东西,因为 AngularJS调用 new 关键字来创建对象。但是返回一个自定义对象好像也不会有错。

4. factory

它是一个可注入的 function,它和 service 的区别就是: factory 是普通的 function,而 service 是一个构造器(constructor),这样 AngularJS调用 service 时会用 new 关键字,而调用 factory 时只是调用普通的 function,所以 factory 可以返回任何东西,而 service 可以不返回 (可查阅 new 关键字的作用)

  1. var myApp = angular.module('myApp',[])
  2.  
  3. myApp.config(function($provide) {
  4. $provide.factory('movie',function() {
  5. return {
  6. title: '功夫瑜伽'
  7. }
  8. })
  9. })
  10.  
  11. myApp.controller('myController',movie.title);
  12. })

语法糖:

  1. $provide.factory('movie',function() {
  2. return {
  3. title: '功夫瑜伽'
  4. }
  5. })

注意:

factory 可以返回任何东西,它实际上是一个只有 $get 方法provider

5. provider

provider 是他们的老大,上面的几乎(除了 constant) 都是 provider 的封装,provider 必须有一个 $get 方法,当然也可以说 provider 是一个可配置的 factory

JS 代码:

  1. var myApp = angular.module('myApp',[])
  2.  
  3. myApp.provider('movie',function() {
  4. var version
  5. return {
  6. setVersion: function(value) {
  7. version = value
  8. },$get: function() {
  9. return {
  10. title: '功夫瑜伽 ' + version
  11. }
  12. }
  13. }
  14. })
  15.  
  16. myApp.config(function(movieProvider) {
  17. movieProvider.setVersion('正在热播')
  18. })
  19.  
  20. myApp.controller('myController',movie.title);
  21. })

注意:

  • 这里 config 方法注入的是 movieProvider,config 方法中只能注入供应商(两个例外是 $provide$injector),用驼峰命名法写成 movieProvider,AngularJS自动帮你注入它的供应商。

  • movie 是一个供应商

6.decorator

decorator 不是 provider,它是用来装饰其它 provider 的,它不能装饰 constant(因为 constant 不是通过 provider() 方法创建的)。

JS 代码:

  1. var myApp = angular.module('myApp',[])
  2.  
  3. // myApp.value('movieTitle','功夫瑜伽6')
  4. myApp.config(function($provide) {
  5. $provide.value('movieTitle','功夫瑜伽7')
  6.  
  7. $provide.decorator('movieTitle',function($delegate) {
  8. return $delegate + ' - 测试'
  9. })
  10. })
  11.  
  12. myApp.controller('myController',movieTitle);
  13. })

总结


  • 所有的供应商都只被实例化一次,也就是说它们都是单例的

  • 除了 constant,所有的供应商都可以被装饰器(decorator)装饰

  • value 就是一个简单可注入的值

  • service 是一个可注入的构造器

  • factory 是一个可注入的方法

  • decorator 可以修改或封装其他的供应商(除了 constant)

  • provider 是一个可配置的 factory

猜你在找的Angularjs相关文章