angularjs自定义服务

angularjs自定义服务

在angularjs中,系统内置的服务都是以$开头的,所以我们的自定义服务尽量避免以$开头。自定义服务的方式有以下几种:

1.使用module的provider方法

2.使用module的factory方法

3.使用module的service方法

使用provider方法

app.provider('myProvider',function(){

this.$get=function(){

}; 

})

通过provider方法创建的服务一定要包含$get方法,provider注入的结果就是$get方法返回的结果,如果不包含$get方法,则程序会报错。

在三种创建服务的方法中,只有用provider方法创建的服务才可以传进config函数,以用于在对象启用之前对模块进行配置。但是在config中进行配置的只能是在$get函数外定义的变量,在下面定义的provider中只有artist与thingFormConfig两个变量可以被访问到,而getArtist与getThingFormConfig两个方法是不能被访问到的。

而且在注入config函数中时,参数名必须由服务名+Provider组成,例如下面的例子中注入到config函数中的就是myProviderProvider

app.controller('myCtrl',['$scope','myProvider',function($scope,myProvider){
  console.log(myProvider.getThingFormConfig());


}]);
app.provider('myProvider',function(){
  this.artist="";
  this.thingFormConfig="";
  this.$get=function(){
  var that=this;
  return {
  getArtist:function(){
   return that.artust; 
  },
  getThingFormConfig:function(){
   return that.thingFormConfig;   
 }
 }
 }


});
app.config(function(myProviderProvider){
 myProviderProvider.thingFormConfig='kingx name';

 })

使用factory方法

app.factory('myFactory',function($http){
   //不一定是要对象类型,实际为任意类型
var factory={};
return factory;

})

通过factory方法创建的服务必须由返回值,即必须有return值,它可以返回任意类型的值,可以是基本数据类型或者对象类型。如果没有return函数,会报错

factory注入的结果就是return返回的结果,可以在被注入的对象中使用注入的结果。

app.controller('myCtrl',['$scope','myFactory',function($scope,myFactory){
consloe.log(myFactory.gentName());
//请求当前文件夹的test.html
myFactory.getData('./test.html').then(function(response){
 console.log(response)//返回test.html字符串形式

 
})


}]);
//使用factory方法
app.factory('myFactory',function($http){
 var factory={};
 var _name='foo';
 //模仿ajax
factory.getData=function(url){

 return $http({
  method :'get',
  url:url
 });
};
factory.getName=function(){
  return _name;
 }

return factory;
})

使用service方法

通过service方法创建的服务,可以不用返回任何值,因为service方法本身会返回一个构造函数,系统会用new关键字来创建一个对象,所以我们可以在service内部使用this关键字,对seivce进行扩展

app.controller('myCtrl',['$scope','myService',function($scope,myService){
  console.log(myService);
 myService.setName('foo');
console.log(myService.getName);



}]);
app.service('myService',function(){
 this._name="";
this.getName=function(){
  return this._name;
};
this.setName=function(name){
  this._name=name;
};


})

如果使用具有返回值的写法,返回值的必须是一个对象,如果只返回基本类型,则返回的相当于this

app.service('myService',function(){
 var obj={};
this._name="";
obj.getName=function(name){
 this._name=name;
return this._name;

}

return obj;

})

三种方法的比较

需要在config中进行全局配置的话,只能选择provider方法

factory和service是使用比较频繁的创建服务的方法。他们之间的唯一区别就是serivce方法通常是new出来的对象,factory方法注入的结果通常是一系列的fanction

provider是创建服务最为复杂的方法,除非你需要创建一个可以复用的代码段可以全局配置,才需要使用provider创建

所有具有特定目的性的对象都是通过factory方法创建的。

 

 

 

 

转载于:https://my.oschina.net/u/3653125/blog/1525142

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值