服务

来源:互联网 发布:4g网络优化 前景 编辑:程序博客网 时间:2024/04/28 04:24

服务是个单例对象,在应用中只 被初始化一次($injector)并且是延迟加载的(需要时才会被创建)。服务提供了把与特定功能相关联的方法集中在一起的接口。它能够在控制器之间进行通信,并且能保证数据的一致性。


注册一个服务

用$injector来创建和注册服务有好几种方式,后面会介绍它们。

1.使用angular.moudle的factory API创建服务是最常见的也是最灵活的方式:

 name(字符串)
需要注册的服务名。
 getFn(函数)
这个函数会在AngularJS创建服务实例时被调用。getFn可以接受一个包含可被注入对象的数组或函数(同控制器一样)


angular.module('myApp.services', [])

//factory('gitubService',[$http,function($http){

}])
.factory('githubService', function($http) {
// 我们的serviceInstance现在可以在函数定义中访问$http服务
var serviceInstance = {};
return serviceInstance;
});


2.service:可以注册一个支持构造函数的服务,它允许我们为服务对象注册一个构造函数

var Person = function($http) {
this.getName = function() {
return $http({ method: 'GET', url: '/api/user'});
};
};
angular.service('personService', Person);


3.provider():所有服务工厂都是由$provide服务创建的,$provide服务负责在运行时初始化这些提供者。提供者是一个具有$get()方法的对象,$injector通过调用$get方法创建服务实例。factory()函数就是用provider()方法注册服务的简略形式。如果希望在config()函数中可以对服务进行配置,必须用provider()来定义服务,t

angular.module('myApp')
.factory('myService', function() {
return {
'username': 'auser'
};
})
// 这与上面工厂的用法等价
.provider('myService', {
$get: function() {
return {
'username': 'auser'
};
}
});


4.constant()可以将一个已经存在的变量值注册为服务,并将其注入到应用的其他部分当中。例如,假设我们需要给后端服务一个apiKey,可以用constant()将其当作常量保存下来。

constant()函数可以接受两个参数。
 name(字符串)
需要注册的常量的名字。
 value(常量)

constant()方法返回一个注册后的服务实例。
angular.module('myApp') .constant('apiKey','123123123')
这个常量服务可以像其他服务一样被注入到配置函数中:
angular.module('myApp')
.controller('MyController', function($scope, apiKey) {
// 可以像上面一样用apiKey作为常量
// 用123123123作为字符串的值
$scope.apiKey = apiKey;
});

5.value()如果服务的$get方法返回的是一个常量,那就没要必要定义一个包含复杂功能的完整服务,可以通过value()函数方便地注册服务。用法参数和constant一样。value()方法和constant()方法之间最主要的区别是,常量可以注入到配置函数中,而值不行。
通常情况下,可以通过value()来注册服务对象或函数,用constant()来配置数据。
angular.module('myApp', [])
.constant('apiKey', '123123123')
.config(function(apiKey) {
// 在这里apiKey将被赋值为123123123
// 就像上面设置的那样
})
.value('FBid','231231231')
.config(function(FBid) {
// 这将抛出一个错误,未知的provider: FBid


使用服务

可以在控制器、指令、过滤器或另外一个服务中通过依赖声明的方式来使用服务。AngularJS会像平时一样在运行期自动处理实例化和依赖加载的相关事宜。

<body>
<div ng-app="myApp">
在过滤器中使用服务:
<h1>{{255 | myFormat}}</h1>
<script type="text/javascript">
var app=angular.module("myApp",[]);
app.service("hhh",function(){
this.fun=function(x){
return x.toString(16)
}
})
app.filter("myFormat",["hhh",function(hhh){
return function(x) {
       return hhh.fun(x);
   };
}])
</script>
</div>
</body>



0 0
原创粉丝点击