弁言
看了许多文章能够照样不太说得出AngularJS
中的几个建立供给商(provider
)的要领(factory()
,service()
,provider()
)到底有啥区分,啥时候该用啥,之前一向傻傻分不清楚,如今来总结一下。
下文中泛指统一用中文,英文即为特指$provide
要领中对应要领建立出的东东
供给商==>泛指provider
效劳==>泛指service
provider==>provider()要领建立的东东
service==>service()要领建立的东东
先说说供给商($provide)
$provide
效劳担任通知Angular
怎样制造一个新的可注入的东西:即效劳。效劳会被叫做供给商的东西来定义,你能够运用$provide
来建立一个供给商。你须要运用$provide
中的provider()
要领来定义一个供给商,同时你也能够经由过程请求$provide
被注入到一个运用的config
函数中来取得$provide
效劳。
上面的形貌是官方wiki的翻译版,假如有些绕的话,看下这张图:
$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
),所以用驼峰定名法写成movieProvider
,Angular
就会帮你注入它的供给商。(更细致可参考文末官方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
末了来看一张对照图:
参考文章
Differences Between Providers in AngularJS
官方wiki:Understanding Dependency Injection
官方wiki翻译版:明白依靠注入
AngularJS中的Provider
伤不起的provider们