1.服务提供能够在应用的整个生命周期保持数据的方法,
它能在控制器之间通信,且能保持数据的一致性。
首先工厂服务,属于服务的一种:
可以在其中设置get,set方法,就像返回一个对象一般。
声明方法为:
app.factory('UserService', function ($http) {
var currentUser = {};//保存当前用户数据
return {
getCurrentUser: function () {
return currentUser;
},
setCurrentUser: function (user) {
currentUser = user;
}
}
});
其他控制器使用此方法时,需要在声明时注入UserService
2.第二节介绍常量与变量:
app.constant('apiKey','123123123');//常量的声明
app.value('apiKey2','123123123');//变量的声明
常量与变量都可以在控制器中得以使用,但是两者唯一的区别是,常量可以在app.config配置函数中使用,变量则不行。
3.接下来是介绍service服务的声明和使用
声明方式:
app.service('UserService', function () {
var currentUser;
this.getCurrentUser = function () {
return currentUser;
};
this.setCurrentUser = function (user) {
currentUser = user;
}
});
服务 service(name,constructor) 它和factory等同效果。
4.provider
提供者 provider(name,{get:function(){…..}})
当传入的函数就是get时,factory就是provider的简化形式
可以使用config()方法对provider进行配置
app.provider('MyUserService',{
//默认url
url:'users.json',
//添加setUrl方法提供修改url的方法
setUrl: function (newUrl) {
this.url = newUrl;
},
$get: function ($http) {//可以在此处注入其他服务
var currentUser={};
var self = this;//将外层引用保存下来
return {
getCurrentUser:function() {
//通过$http请求数据
return $http.get(self.url);
},
setCurrentUser:function(user) {
currentUser = user;
}
}
}
});
app.config(function (MyUserServiceProvider) {
//此例为修改provider中的Url
MyUserServiceProvider.setUrl('data/users.json');
});
5.包装器
在app.config中使用包装器,对provider进行包装:
app.provider('MyUserService',{
//默认url
url:'users.json',
//添加setUrl方法提供修改url的方法
setUrl: function (newUrl) {
this.url = newUrl;
},
$get: function ($http) {//可以在此处注入其他服务
var currentUser={};
var self = this;//将外层引用保存下来
return {
getCurrentUser:function() {
//通过$http请求数据
return $http.get(self.url);
},
setCurrentUser:function(user) {
currentUser = user;
}
}
}
});
//包装之后就可以在config中对原有方法进行修改增加,而不影响原有代码
//此处要对MyUserService进行包装,因此我们在config函数中注入$provide
app.config(function ($provide,MyUserServiceProvider) {
MyUserServiceProvider.setUrl('data/users.json');
//对MyUserService包装,第一个参数指定为拦截服务的名称
//此处需要在构造函数中注入$delegate
//因为需要输出控制台信息,所以注入$log
$provide.decorator('MyUserService', function ($delegate,$log) {
return {
getCurrentUser: function () {
//执行所拦截服务之前的方法
var p = $delegate.getCurrentUser();
//额外做些事情:记录一下该次请求所消耗时间
//首先记录请求发起时间
var startAt = new Date();
p.finally(function () {
$log.info('消耗时间:'+(new Date()-startAt)+'毫秒')
});
return p;
}
}
})
});