原文: http://blog.xebia.com/2013/09/01/differences-between-providers-in-angularjs/

什么是Provider?

AngularJS docs 是这样定义provider的:

provider是一个对象, 它有一个$get()方法. injector 调用$get方法以此来创建一个service的实例. Provider还有一些其他的方法用来配置provider.

AngularJS 使用 $provide 注册新的provider. providers 基本上都会创建一个新的实例, 但是每一个provider只有一个实例.  $provide 有6种创建自定义provider的方法, 下面我会分别解释这6种方法的用法. 6种方法如下:

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

value是一个简单的可被注入的值. value可以是string, number, function. 和constant不同的是value不能被注入到configurations,  且value能被decorators拦截.

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是 singleton 的, 只会被创建一次. Services 用来给controller提供数据是一个不错的选择.

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是以个可注入的function. factory和service非常相似, 也是单例的. a factory是一个简单的 provider 只有$get方法.

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  function和配置选项. 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只会被实例化一次. 这一位着他们都是单例的.
  • 所有的providers 除了constant都可以被decorated.
  • constant是以个值, 可以被注入到任意地方. constant的值不能被改变.
  • value是一个简单的可注入的值.
  • service是一个可注入的构造函数.
  • factory是以个可注入的function.
  • decorator可以修改封装其它的providers除了constant.
  • provider是一个可配置的factory.

[译]AngularJS中几种Providers(Factory, Service, Provider)的区别的更多相关文章

  1. angularjs 中 Factory,Service,Provider 之间的区别

    本片文章是使用了 angularjs 中使用 service 在controller 之间 share 对象和数据 的code(http://jsfiddle.net/kn46u0uj/1/) 来进行 ...

  2. angularjs factory,service,provider 自定义服务的不同

    angularjs框架学了有一段时间了,感觉很好用.可以把angularjs的app理解成php的class,controller是控制器,而内置服务和自定义服务就可以理解成models了.angul ...

  3. AngularJS 讲解五, Factory ,Service , Provider

    一. 首先说一下,为什么要引入Factory,Service和Provider这三个Service层. 1.因为我们不应该在controller层写入大量的业务逻辑和持久化数据,controller层 ...

  4. centos7也支持service命令启动服务吗,对于centos7 中的systemctl和旧的service命令的区别和联系

    一.centos7也支持service命令启动服务吗 CentOS 7.0中一个最主要的改变,就是切换到了systemd.它用于替代红帽企业版Linux前任版本中的SysV和Upstart,对系统和服 ...

  5. java中4种修饰符访问权限的区别及详解全过程

    java中4种修饰符访问权限的区别及详解全过程 http://jingyan.baidu.com/article/fedf0737700b3335ac8977ca.html java中4中修饰符分别为 ...

  6. AngularJS服务中serivce,factory,provider的区别

    Angular服务是一个由服务工厂创建的单例对象.这些服务工厂是由 service provider 依次创建的.而service providers是构造函数.它们必须包含一个$get属性用于在实例 ...

  7. 深入了解angularjs中的$digest与$apply方法,从区别聊到使用优化

     壹 ❀ 引 如果有人问,在angularjs中修改模型数据为何视图会同步更新呢,我想大多数人一定会回答脏检查(Dirty Checking)相关概念.没错,在angularjs中作用域(scope) ...

  8. angularjs中directive指令与component组件有什么区别?

     壹 ❀ 引 我在前面花了两篇博客分别系统化介绍了angularjs中的directive指令与component组件,当然directive也能实现组件这点毋庸置疑.在了解完两者后,即便我们知道co ...

  9. AngularJS中service,factory,provider的区别(转载:http://my.oschina.net/tanweijie/blog/295067)

    目录[-] 一.service引导 二.service 1.factory() ‍2.service()‍ ‍3.provider()‍‍ 一.service引导 刚开始学习Angular的时候,经常 ...

随机推荐

  1. C#关闭窗口代码

    if (MessageBox.Show("请您确认是否退出(Y/N)", "系统提示", MessageBoxButtons.YesNo, MessageBox ...

  2. [iOS 图像处理相关]

    //使用CGImage获取并修改图片像素 #define Mask8(x) ( (x) & 0xFF ) #define R(x) ( Mask8(x) ) #define G(x) ( Ma ...

  3. BeautifulSoup高级应用 之 CSS selectors /CSS 选择器

    BeautifulSoup支持最常用的CSS selectors,这是将字符串转化为Tag对象或者BeautifulSoup自身的.select()方法. 本篇所使用的html为: html_doc ...

  4. 数据结构作业——N!的位数(斯特灵公式)

    Description 求N!的位数 Input 输入第一行为一个正整数 n(1<=n<=25000). Output 输出 n!的位数. Sample Input 1020 Sample ...

  5. django makemigrations的一个特性

    Migrations will run the same way on the same dataset and produce consistent results, meaning that wh ...

  6. 高可用与负载均衡(7)之聊聊Lvs-DR+Keepalived的解决方案

    今天直接开门见山了,直接说配置吧.首先介绍下我这的环境 如有问题,请联系我18500777133@sina.cn IP 安装软件 192.168.1.7 lvs1+keepalived master角 ...

  7. mybatis的批量删除

    公司工程用的是Mybatis的example的类,自动生成了对数据库的操作,批量操作的今天用到了,两种方式,一种需要拓展它生成的类,另一种自带的. 批量删除的id是以集合List传递 id以List& ...

  8. BZOJ3678: wangxz与OJ

    splay缩点. #include<bits/stdc++.h> #define L(t) (t)->c[0] #define R(t) (t)->c[1] #define F ...

  9. Objective -C学习笔记 之copy(复制)

    //自定义类对象实现copy需要遵守copy协议(否则程序崩溃),实现必须实现的协议方法,里面的代码就决定了你的copy是深是浅 #import <Foundation/Foundation.h ...

  10. StringUtils 的常用方法

    StringUtils 方法的操作对象是 Java.lang.String 类型的对象,是 JDK 提供的 String 类型操作方法的补充,并且是 null 安全的(即如果输入参数 String 为 ...