AngularJS 的供给商($provide)
$provide
效劳担任通知 AngularJS
怎样建立一个新的可注入的东西: 即效劳。
效劳会被叫做供给商的东西来定义, 能够运用 $provide
来建立一个供给商。
建立供给商的要领:
运用
$provide
中的provider()
要领来定义一个供给商;经由过程请求
$provide
被注入一个运用的config
函数中来取得$provide
效劳;
定义供给商的要领们
constant
value
service
factory
provider
decorator
1. constant
定义常量的, 它定义的值不能被转变, 它能够被注入到任何地方, 然则不能被装潢器(decorator
) 装潢。
DEMO:
HTML 代码:
<!DOCTYPE html>
<html lang="en">
<head>
<title>demo</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div ng-app="myApp">
<div ng-controller="myController">
</div>
</div>
<script src="js/angular.js">
</script>
<script src="js/service.js"></script>
</body>
</html>
JS 代码:
var myApp = angular.module('myApp', [])
myApp.config(function($provide) {
$provide.constant('movieTitle', '工夫瑜伽')
})
myApp.controller('myController', function(movieTitle) {
console.log('movieTitle: ', movieTitle);
})
语法糖:
myApp.constant('movieTitle', '工夫瑜伽')
2. value
它能够是 string
、 number
、 function
, 它和 constant
的不同之处在于, 它能够被修正, 不能被注入到 config
中, 然则它能够被 decorator
装潢。
HTML 代码:
<!DOCTYPE html>
<html lang="en">
<head>
<title>demo</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div ng-app="myApp">
<div ng-controller="myController">
</div>
</div>
<script src="js/angular.js">
</script>
<script src="js/service.js"></script>
</body>
</html>
JS 代码:
var myApp = angular.module('myApp', [])
myApp.config(function($provide) {
$provide.value('movieTitle', '工夫瑜伽')
})
myApp.controller('myController', function(movieTitle) {
console.log('movieTitle: ', movieTitle);
})
语法糖:
myApp.value('movieTitle', '工夫瑜伽')
3. service
它是一个可注入的组织器, 在 AngularJS
中它是单例的, 用它在 Controller
中通讯或许同享数据都适宜
var myApp = angular.module('myApp', [])
myApp.config(function($provide) {
$provide.service('movie', function() {
this.title = '工夫瑜伽'
})
})
myApp.controller('myController', function(movie) {
console.log('movieTitle: ', movie.title);
})
语法糖:
myApp.service('movie', function () {
this.title = '工夫瑜伽'
})
注重:
在 service
内里能够不必返回东西, 由于 AngularJS
会挪用 new
关键字来建立对象。然则返回一个自定义对象彷佛也不会有错。
4. factory
它是一个可注入的 function
, 它和 service
的区分就是: factory
是一般的 function
, 而 service
是一个组织器(constructor
), 如许 AngularJS
在挪用 service
时会用 new
关键字, 而挪用 factory
时只是挪用一般的 function
, 所以 factory
能够返回任何东西, 而 service
能够不返回 (可查阅 new 关键字的作用)
var myApp = angular.module('myApp', [])
myApp.config(function($provide) {
$provide.factory('movie', function() {
return {
title: '工夫瑜伽'
}
})
})
myApp.controller('myController', function(movie) {
console.log('movieTitle: ', movie.title);
})
语法糖:
$provide.factory('movie', function() {
return {
title: '工夫瑜伽'
}
})
注重:
factory
能够返回任何东西, 它实际上是一个只要 $get
要领的 provider
5. provider
provider
是他们的老大, 上面的险些(除了 constant
) 都是 provider
的封装, provider
必须有一个 $get
要领, 固然也能够说 provider
是一个可设置的 factory
。
JS 代码:
var myApp = angular.module('myApp', [])
myApp.provider('movie', function() {
var version
return {
setVersion: function(value) {
version = value
},
$get: function() {
return {
title: '工夫瑜伽 ' + version
}
}
}
})
myApp.config(function(movieProvider) {
movieProvider.setVersion('正在热播')
})
myApp.controller('myController', function(movie) {
console.log('movieTitle: ', movie.title);
})
注重:
这里
config
要领注入的是movieProvider
,config
要领中只能注入供给商(两个破例是$provide
和$injector
),用驼峰定名法写成movieProvider
,AngularJS
会自动帮你注入它的供给商。movie
是一个供给商
6.decorator
decorator
不是 provider
, 它是用来装潢别的 provider
的, 它不能装潢 constant
(由于 constant
不是经由过程 provider()
要领建立的)。
JS 代码:
var myApp = angular.module('myApp', [])
// myApp.value('movieTitle', '工夫瑜伽6')
myApp.config(function($provide) {
$provide.value('movieTitle', '工夫瑜伽7')
$provide.decorator('movieTitle', function($delegate) {
return $delegate + ' - 测试'
})
})
myApp.controller('myController', function(movieTitle) {
console.log('movieTitle: ', movieTitle);
})
总结
一切的供给商都只被实例化一次, 也就是说它们都是单例的
除了
constant
, 一切的供给商都能够被装潢器(decorator
)装潢value
就是一个简朴可注入的值service
是一个可注入的组织器factory
是一个可注入的要领decorator
能够修正或封装其他的供给商(除了constant
)provider
是一个可设置的factory