谈谈AngularJS中Providers之间的差异

互联网 20-8-26

相关教程推荐:《angular教程》

什么是Provider?

angularjs文档对provider的定义:

provider是一个带有$get()方法的对象。injector调用$get方法创建一个新的service的实例。provider还有一些其他的方法,可以用来配置provider。

AngularJS使用$provide注册新的providers。providers基本上都会创建一个新实例, 但每个provider只创建一次。$provide提供了6种方法创建自定义provider, 我会用简单的代码示例分别解释他们。

6种方法如下:

  • constant

  • value

  • service

  • factory

  • decorator

  • provider

Constant

constant能被injected到任何地方。constant不能被decorator拦截, 意味着constant的值永远不能被改变。

var app = angular.module('app', []);  app.config(function ($provide) {   $provide.constant('movieTitle', 'The Matrix'); });   app.controller('ctrl', function (movieTitle) {   expect(movieTitle).toEqual('The Matrix'); });

AngularJS提供了一种更简便的方式创建constant. 你可以将上面3至5行的代码重写为:

app.constant('movieTitle', 'The Matrix');

Value

var app = angular.module('app', []);  app.config(function ($provide) {  $provide.value('movieTitle', 'The Matrix') });  app.controller('ctrl', function (movieTitle) {  expect(movieTitle).toEqual('The Matrix'); })

创建value的简单方法:

app.value('movieTitle', 'The Matrix');

Service

service是一个可以注入的构造函数。如果你想,你可以在函数中指定需要的依赖。

service是一个单例, 只被创建一次。services是一个很好的方式,用于控制器之间传递数据,如共享数据。

var app = angular.module('app' ,\[\]);  app.config(function ($provide) {  $provide.service('movie', function () {    this.title = 'The Matrix';  }); });  app.controller('ctrl', function (movie) {  expect(movie.title).toEqual('The Matrix'); });

创建service简单方式:

app.service('movie', function () {  this.title = 'The Matrix'; });

Factory

factory是一个可注入的函数。

与service的相同点:factory也是一个单例,也可以在此函数中指定依赖。

区别是:factory注入一个普通函数,AngularJs将调用此函数,而service注入一个构造函数。

var app = angular.module('app', []);  app.config(function ($provide) {  $provide.factory('movie', function () {    return {      title: 'The Matrix';    }  }); });   app.controller('ctrl', function (movie) {  expect(movie.title).toEqual('The Matrix'); });

创建factory的简单方式:

app.factory('movie', function () {  return {    title: 'The Matrix';  } });

Decorator

decorator可以修改或封装其它的providers,但constant不能被装饰。

var app = angular.module('app', []);  app.value('movieTitle', 'The Matrix');  app.config(function ($provide) {  $provide.decorator('movieTitle', function ($delegate) {    return $delegate + ' - starring Keanu Reeves';  }); });  app.controller('myController', function (movieTitle) {  expect(movieTitle).toEqual('The Matrix - starring Keanu Reeves'); });

Provider

provider是所有providers中最复杂的,可以有复杂的creation函数和配置选项。

provider实际是一个可配置的factory。 provider接受一个对象或构造函数。

var app = angular.module('app', []);  app.provider('movie', function () {  var version;  return {    setVersion: function (value) {      version = value;    },    $get: function () {      return {        title: 'The Matrix' + ' ' + version      }    }  } });  app.config(function (movieProvider) {  movieProvider.setVersion('Reloaded'); });  app.controller('ctrl', function (movie) {  expect(movie.title).toEqual('The Matrix Reloaded'); });

总结

所有的providers只会被实例化一次,因此他们都是单例的。

除了constant,其他的providers都可以被decorated。

constant是一个值, 可以被注入到任何地方,它的值不能被改变。

value是一个简单的可注入的值。

service是一个可注入的构造函数。

factory是以个可注入的函数。

decorator可以修改或封装其它的providers,除了constant。

provider是一个可配置的factory。

英文原文地址:https://xebia.com/blog/differences-between-providers-in-angularjs/

相关推荐:编程教学

以上就是谈谈AngularJS中Providers之间的差异的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: Providers
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:用JQ + CSS实现浪漫表白必备

相关资讯