AngularJS中几种Providers(Factory, Service, Provider)的区别

原文: 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.
时间: 2024-08-27 04:05:07

AngularJS中几种Providers(Factory, Service, Provider)的区别的相关文章

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

本片文章是使用了 angularjs 中使用 service 在controller 之间 share 对象和数据 的code(http://jsfiddle.net/kn46u0uj/1/) 来进行演示 Factory,Service,Provider 之间的区别 1. Factory factory('dataService',function(){ return { golbal_sitename:"this is the shared value", sayHello:func

AngularJS中serivce,factory,provider的区别

一.service引导 刚开始学习Angular的时候,经常被误解和被初学者问到的组件是 service(), factory(), 和 provide()这几个方法之间的差别.This is where we'll start the twenty-five days of Angular calendar. 二.service 在Angular里面,services作为单例对象在需要到的时候被创建,只有在应用生命周期结束的时候(关闭浏览器)才会被清除.而controllers在不需要的时候就

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

angularjs框架学了有一段时间了,感觉很好用.可以把angularjs的app理解成php的class,controller是控制器,而内置服务和自定义服务就可以理解成models了.angularjs的内置服务多,例如:$scope,$rootScope,$http,$q,$resource,$routeProvider等等,下面来说一下怎么自定义服务 一,factory,service,provider自定义服务,services.js 'use strict'; /* Service

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

java中4种修饰符访问权限的区别及详解全过程 http://jingyan.baidu.com/article/fedf0737700b3335ac8977ca.html java中4中修饰符分别为public.protect.default.private,他们这就说明了面向对象的封装性,所以我们要适用他们尽可能的让权限降到最低,从而安全性提高. 下面详细讲述下它们的访问权限问题.(同一个类中除内部类外所有修饰符都是可以访问的,所以下面排除这种情况.) 首先在这里把它们的访问权限表示出来:

AngularJS中service,factory,provider的区别

1.factory() Angular里面创建service最简单的方式是使用factory()方法. factory()让我们通过返回一个包含service方法和数据的对象来定义一个service.在service方法里面我们可以注入services,比如 $http 和 $q等. 在service里面当我们仅仅需要的是一个方法和数据的集合且不需要处理复杂的逻辑的时候,factory()是一个非常不错的选择. 注意:需要使用.config()来配置service的时候不能使用factory()

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

目录[-] 一.service引导 二.service 1.factory() ‍2.service()‍ ‍3.provider()‍‍ 一.service引导 刚开始学习Angular的时候,经常被误解和被初学者问到的组件是 service(), factory(), 和 provide()这几个方法之间的差别.This is where we'll start the twenty-five days of Angular calendar. 二.service 在Angular里面,se

AngularJS中的$http.post与jQuery.post的区别

很多时候我们需要用ajax提交post数据,angularjs与jq类似,也有封装好的post. 但是jQuery的post明显比angularjs的要简单一些,人性化一些. AngularJS: ? 1 2 3 4 $http.post('do-submit.php',myData) .success(function(){     // some code }); jQuery: ? 1 2 3 $.post('do-submit.php', myData, function() {    

跟我学AngularJs:Service、Factory、Provider依赖注入使用与区别

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka        本教程使用AngularJs版本:1.5.3        AngularJs GitHub: https://github.com/angular/angular.js/        AngularJs下载地址:https://angularjs.org/ 用有过Spring的人都知道,Spring的核心思想就是DI(依赖注入,Dependency Injection)和I

深究AngularJS——自定义服务详解(factory、service、provider)

前言 3种创建自定义服务的方式. Factory Service Provider 大家应该知道,AngularJS是后台人员在工作之余发明的,他主要应用了后台早就存在的分层思想.所以我们得了解下分层的作用,如果你是前端人员不了解什么是分层,那么你最好问问你后台的小伙伴. dao层:就是Model层,在后台时,这一层的作用,就要是写与数据库交互数据的一层,在angularJS里就主要是写ajax的. service层:主查写逻辑代码的,但在angularJS里也可以持久化数据(充当数据容器),以