转自:http://blog.csdn.net/ywl570717586/article/details/51306176

初学 AngularJS 时, 肯定会对其提供 factory 、 service 和 provider 感到疑惑, 这三种都是提供服务的方式, 他们到底有什么区别呢?

factory

factory 可以认为是设计模式中的工厂方法, 就是你提供一个方法, 该方法返回一个对象的实例, 对于 AngularJS 的 factory 来说, 就是先定义一个对象, 给这个对象添加属性和方法, 然后返回这个对象, 例如:

var app = angular.module('MyApp', []);  

app.factory('MyFactory', function() {
// define result object of factory.
var result = {};
// add some property and method to the object
result.greeting = 'Hello from factory.';
// return the object;
return result;
});

lain copy

最后 controller 拿到的就是 result 对象, 相当于下面的代码:

[javascript] view plain copy

 

  1. var factoryResult = MyFactory();

所谓的 factory 就是这么简单。

service

service 通过 new 运算符进行实例化, 可以认为是一个类型, 只要把属性和方法添加到 this 对象上即可, 不用显式返回什么对象, 比如下面的代码:

[javascript] view plain copy

 

  1. app.service('MyService', function() {
  2. this.greeting = 'Hello from service';
  3. });

controller 拿到的对象就是上面代码中 this 指向的对象, 相当于下面的代码:

[javascript] view plain copy

 

  1. var serviceObj = new MyService();

provider

与 factory 和 service 稍有不同的是, provider 必须提供一个 $get 方法, $get 方法和 factory 要求是一致的, 即: 先定义一个对象, 给这个对象添加属性和方法, 然后返回这个对象, 例如:

[javascript] view plain copy

 

  1. app.provider('MyProvider', function() {
  2. this.$get = function() {
  3. var result = {};
  4. result.greeting = 'Hello from provider';
  5. return result;
  6. }
  7. })

最后 controller 拿到的对象就是 provider 的 $get 方法返回的对象, 相当于下面的代码:

[javascript] view plain copy

 

  1. var instance = new MyProvider();
  2. var provider = instance.$get();

使用 factory、 service 与 provider

factory、 service 与 provider 使用起来是一样的, 都是通过 AngularJS 的依赖注入使用, 比如:

[javascript] view plain copy

 

  1. // inject factory, service and provider to a controller
  2. app.controller('TestController', ['$scope', 'MyFactory', 'MyService', 'MyProvider', function($scope, myFactory, myService, myProvider) {
  3. $scope.greetingFromFactory = myFactory.greeting;
  4. $scope.greetingFromService = myService.greeting;
  5. $scope.greetingFromProvider = myProvider.greeting;
  6. }]);

对应的 HTML 视图为:

[html] view plain copy

 

  1. <body ng-controller="TestController">
  2. <p>greeting from factory: {{greetingFromFactory}} </p>
  3. <p>greeting from service: {{greetingFromService}} </p>
  4. <p>greeting from provider: {{greetingFromProvider}} </p>
  5. </body>

provider 可以在应用启动时进行配置

provider 的特殊之处就是可以在 module 启动时进行配置, 从而达到特殊的用途, 比如在上面的 provider 中可以添加一个 setName 方法, 可以在启动时调用这个方法, 进行一些额外的初始化工作:

[javascript] view plain copy

 

  1. app.provider('MyProvider', function() {
  2. // default name is 'anonymous';
  3. var defaultName = 'anonymous';
  4. var name = defaultName;
  5. // setName can be called duaring module init
  6. this.setName = function(newName) {
  7. name = newName;
  8. }
  9. this.$get = function() {
  10. var result = {};
  11. result.greeting = 'Hello from provider';
  12. result.name = name;
  13. result.defaultName = defaultName;
  14. return result;
  15. }
  16. })

添加了 setName 方法之后, 可以 module 启动时来调用这个方法, 实现对 provider 的配置

[javascript] view plain copy

 

  1. app.config(function(MyProviderProvider) {
  2. MyProviderProvider.setName('Angularjs Provider');
  3. });

在 controller 中添加显示 provider 的这些信息:

[html] view plain copy

 

  1. app.controller('TestController', ['$scope', 'MyFactory', 'MyService', 'MyProvider', function($scope, myFactory, myService, myProvider) {
  2. $scope.greetingFromFactory = myFactory.greeting;
  3. $scope.greetingFromService = myService.greeting;
  4. $scope.greetingFromProvider = myProvider.greeting;
  5. $scope.defaultName = myProvider.defaultName;
  6. $scope.name = myProvider.name
  7. }]);

对应的 HTML 视图也调整一下

[html] view plain copy

 

  1. <body ng-controller="TestController">
  2. <p>greeting from factory: {{greetingFromFactory}} </p>
  3. <p>greeting from service: {{greetingFromService}}</p>
  4. <p>greeting from provider: {{greetingFromProvider}} </p>
  5. <p>defaultName: {{defaultName}}, config to: {{name}} </p>
  6. </body>

最后程序运行截图如下:

AngularJS 中的 factory、 service 和 provider区别,简单易懂的更多相关文章

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

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

  2. AngularJS进阶(三十三)书海拾贝之简介AngularJS中使用factory和service的方法

    简介AngularJS中使用factory和service的方法 AngularJS支持使用服务的体系结构"关注点分离"的概念.服务是JavaScript函数,并负责只做一个特定的 ...

  3. angularjs中factory, service和provider

    在Angular里面,services作为单例对象在需要到的时候被创建,只有在应用生命周期结束的时候(关闭浏览器)才会被清除.而controllers在不需要的时候就会被销毁了(因为service的底 ...

  4. 简介AngularJS中使用factory和service的方法

    AngularJS支持使用服务的体系结构“关注点分离”的概念.服务是JavaScript函数,并负责只做一个特定的任务.这也使得他们即维护和测试的单独实体.控制器,过滤器可以调用它们作为需求的基础.服 ...

  5. 我也谈“the difference between Factory, Service, and Provider in Angular”

    看完这篇文章之后的理解与实践:原文地址:http://tylermcginnis.com/angularjs-factory-vs-service-vs-provider/ <!doctype ...

  6. CommonJS, AMD, CMD是什么及区别--简单易懂有实例

    CommonJS, AMD, CMD都是JS模块化的规范. CommonJS是服务器端js模块化的规范,NodeJS是这种规范的实现. AMD(异步模块定义)和CMD(通用模块定义)都是浏览器端js模 ...

  7. AngularJS 之 Factory vs Service vs Provider【转】

    英文原文:AngularJS: Factory vs Service vs Provider 当你初试 Angular 时,很自然地就会往 controller 和 scope 里堆满不必要的逻辑.一 ...

  8. AngularJS之Factory vs Service vs Provider

    原文  http://www.linuxeden.com/html/news/20140509/151538.html 当你初试 Angular 时,很自然地就会往 controller 和 scop ...

  9. [转载]AngularJS之Factory vs Service vs Provider

    http://www.oschina.net/translate/angularjs-factory-vs-service-vs-provider http://tylermcginnis.com/a ...

随机推荐

  1. RocketMQ实现事务消息

    在RocketMQ4.3.0版本后,开放了事务消息这一特性,对于分布式事务而言,最常说的还是二阶段提交协议,那么RocketMQ的事务消息又是怎么一回事呢,这里主要带着以下几个问题来探究一下Rocke ...

  2. BZOJ3378:[USACO]MooFest 狂欢节(树状数组)

    Description 每一年,约翰的N(1≤N≤20000)只奶牛参加奶牛狂欢节.这是一个全世界奶牛都参加的大联欢.狂欢节包括很多有趣的活动,比如干草堆叠大赛.跳牛栏大赛,奶牛之间有时还相互扎屁股取 ...

  3. 15.io流,递归

    一.file的常用api 二.算法:递归1.定义:递归算法是把问题转化为规模缩小了的同类问题的子问题.然后递归调用函数(或过程)来表示问题的解.一个过程(或函数)直接或间接调用自己本身,这种过程(或函 ...

  4. CF980E The Number Games

    CF980E The Number Games 给定一棵大小为 \(n\) 的树,第 \(i\) 个点的点权为 \(2^i\) ,删掉 \(k\) 个点及其连边,使得剩下的点组成一个连通块,且权值和最 ...

  5. a,b为2个整型变量,在不引入第三个变量的前提下写一个算法实现 a与b的值互换

    package com.Summer_0424.cn; /** * @author Summer * a,b为2个整型变量,在不引入第三个变量的前提下写一个算法实现 a与b的值互换? */ publi ...

  6. 获取数值型数组的最大值和最小值,使用遍历获取每一个值,然后记录最大值和最小值的方式。(数组遍历嵌套if判断语句)

    package com.Summer_0420.cn; /** * @author Summer * .获取数值型数组的最大值.最小值 * 方法:遍历获取每一个值,记录最大值: * 方法:遍历获取每一 ...

  7. 根据考试成绩输出对应的礼物,90分以上爸爸给买电脑,80分以上爸爸给买手机, 60分以上爸爸请吃一顿大餐,60分以下爸爸给买学习资料。 要求:该题使用多重if完成

    package com.Summer_0417.cn; import java.util.Scanner; /** * @author Summer * 根据考试成绩输出对应的礼物, * 90分以上爸 ...

  8. 开源工具 DotnetRSA 快速生成和转换RSA秘钥

    一.简介 DotnetRSA 是一个利用 .NET Core 2.1 开发的 .NET Global Tool,是可以想npm全局安装一样,安装在你的系统中,只需敲一行命令便可以快速生成RSA加密算法 ...

  9. eclipse 常用配置

    一.内置tomcat配置 解决eclipse 内置tomcat 与本地tomcat 端口冲突 传送门:http://www.cnblogs.com/tweet/p/7568979.html 二.字体设 ...

  10. koa-router

    为了处理URL,我们需要引入koa-router这个middleware,让它负责处理URL映射. 我们把上一节的hello-koa工程复制一份,重命名为url-koa. 先在package.json ...