AngularJS中的Provider们:Service和Factory等的区分

弁言

看了许多文章能够照样不太说得出AngularJS中的几个建立供给商(provider)的要领(factory(),service(),provider())到底有啥区分,啥时候该用啥,之前一向傻傻分不清楚,如今来总结一下。

下文中泛指统一用中文,英文即为特指$provide要领中对应要领建立出的东东

供给商==>泛指provider
效劳==>泛指service

provider==>provider()要领建立的东东
service==>service()要领建立的东东

先说说供给商($provide)

$provide效劳担任通知Angular怎样制造一个新的可注入的东西:即效劳。效劳会被叫做供给商的东西来定义,你能够运用$provide来建立一个供给商。你须要运用$provide中的provider()要领来定义一个供给商,同时你也能够经由过程请求$provide被注入到一个运用的config函数中来取得$provide效劳。

上面的形貌是官方wiki的翻译版,假如有些绕的话,看下这张图:
《AngularJS中的Provider们:Service和Factory等的区分》

  • $provide是一个效劳,在Auto模块中

  • 这个效劳下面有很多要领,是用来定义供给商

  • 而供给商是用来供给效劳的,被注入来注入去的东西就是供给商们供给的效劳了

下面是一个例子:

myMod.config(function($provide) {
  $provide.provider('greeting', function() {
    this.$get = function() {
      return function(name) {
        alert("Hello, " + name);
      };
    };
  });
});

这个例子能够说是终究形状,先也许看下

定义供给商的要领们

AngularJS$provide去定义一个供给商,这个$provide有5个用来建立供给商的要领:

  • constant

  • value

  • service

  • factory

  • provider

  • decorator 我没有说我也是,我只是途经o(╯□╰)o

Constant

定义常量用的,这货定义的值固然就不能被转变,它能够被注入到任何地方,然则不能被装潢器(decorator)装潢

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

语法糖:

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

Value

这货能够是string,number以至function,它和constant的不同之处在于,它能够被修正,不能被注入到config中,然则它能够被decorator装潢

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

语法糖:

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

Service

它是一个可注入的组织器,在AngularJS中它是单例的,用它在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');
});

语法糖:

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

service内里能够不必返回东西,由于AngularJS会挪用new关键字来建立对象。然则返回一个自定义对象彷佛也不会失足。

Factory

它是一个可注入的function,它和service的区分就是:factory是一般function,而service是一个组织器(constructor),如许Angular在挪用service时会用new关键字,而挪用factory时只是挪用一般的function,所以factory能够返回任何东西,而service能够不返回(可查阅new关键字的作用)

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');
});

语法糖:

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

factory能够返回任何东西,它实际上是一个只要$get要领的provider

Provider

provider是他们的老大,上面的险些(除了constant)都是provider的封装,provider必须有一个$get要领,固然也能够说provider是一个可设置的factory

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');
});

注重这里config要领注入的是movieProvider,上面定义了一个供给商叫movie,然则注入到config中不能直接写movie,由于前文讲了注入的谁人东西就是效劳,是供给商供给出来的,而config中又只能注入供给商(两个破例是$provide$injector),所以用驼峰定名法写成movieProviderAngular就会帮你注入它的供给商。(更细致可参考文末官方wiki翻译版中的设置provider

Decorator

这个比较特别,它不是provider,它是用来装潢其他provider的,而前面也说过,他不能装潢Constant,由于实际上Constant不是经由过程provider()要领建立的。

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');
});

总结

  • 一切的供给商都只被实例化一次,也就说他们都是单例的

  • 除了constant,一切的供给商都能够被装潢器(decorator)装潢

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

  • service是一个可注入的组织器

  • factory是一个可注入的要领

  • decorator能够修正或封装其他的供给商,固然除了constant

  • provider是一个可设置的factory

末了来看一张对照图:

《AngularJS中的Provider们:Service和Factory等的区分》

参考文章

Differences Between Providers in AngularJS
官方wiki:Understanding Dependency Injection
官方wiki翻译版:明白依靠注入
AngularJS中的Provider
伤不起的provider们

    原文作者:savokiss
    原文地址: https://segmentfault.com/a/1190000003096933
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞