angularJS中如何写服务
服务的用途
- 服务提供了一种能在应用的整个生命周期内保持数据的方法,它能够在控制器之间进行通信,并且能保证数据的一致性
- 服务提供了把特定功能相关联的方法集中在一起的接口
如何创建服务
- angularJS提供了一些内置服务,同时为复杂应用创建我们自己的服务也是很有必要的
- anguarjs中创建自己的服务是非常容易的,只需要注册这个服务即可。服务被注册后,angularJS编译器就可以引用他,并且在运行时把它当作依赖加载进来
示例:
angular.module('freefedService',[]).factory('ajaxService',['$http','$q',function($http,$q){
var deferred = $q.defer();
return {
ajaxFunc : function(params){
var params = params || {};
$http({
method : params.method || 'post',
url : params.url || '',
data : params. data || {},
responseType : params.type || 'json'
}).success(function(data){
deferred.resolve(data);
}).error(function(reason){
deferred.reject(reason);
});
return deferred.promise()
}
};
}]);
如何使用服务
- 可以在控制器、指令或另外一个服务中通过依赖声明的方式来使用服务
demo.html <!doctype html>
<html ng-app="freefedApp">
<head>
<title>angular应用demo</title>
<script src="angular.js"></script>
<script src="service.js"></script>
<script src="app.js"></script>
</head>
<body>
<div ng-controller="userCtrl">
<div class="user-center">
<span class="user-icon"><img src="{{vm.user.pic}}" /></span>
<span class="user-name">{{vm.user.name}}</span>
</div>
</div>
</body>
</html>
service.js angular.module('freefedService',[]).factory('ajaxService',['$http','$q',function($http,$q){
var deferred = $q.defer();
return {
ajaxFunc : function(params){
var params = params || {};
$http({
method : params.method || 'post',
url : params.url || '',
data : params. data || {},
responseType : params.type || 'json'
}).success(function(data){
deferred.resolve(data);
}).error(function(reason){
deferred.reject(reason);
});
return deferred.promise()
}
};
}]); app.js /*声明module*/
var module = angular.module('freefedApp',['freefedService']); /*声明控制器*/
module.controller('userCtrl',['$scope','ajaxService',function($scope,ajaxService){
var vm = $scope.vm = $scope.vm || {};
vm.user = {};
//调用ajaxService服务
ajaxService.ajaxFunc( {
url : '/getUser.php'
} ).then(function(data){
vm.user.pic= data.pic;
vm.user.name = data.name;
},function(error){
alert( error.msg );
}
);
}])
多种创建服务方式
service
使用service可以注册一个支持构造函数的服务,它允许我们为服务对象注册一个构造函数,service函数接收两个参数:
name(字符串)需要注册的服务名
constructor(函数) 构造函数,调用它来实例化服务对象, 注入到应用中,会生成一个构造函数的实例对象被引用
angular.module('freefedService',[]).service('myService',function(){ this.getUser = function(){}; });
factory
factory是创建和配置服务的最快捷的方式,相对于service函数,factory更加适用于当你在设计一个需要私有方法或属性的类的时候使用,factory函数接收两个参数:
name(字符串) 需要注册的服务名
getFn(函数) 这个函数会在angularJS创建服务时调用
//有私有方法、属性的类示例:
angular.module('freefedService',[]).factory('myService',function(){
var _version = '1.1.0'; //私有属性
var _method = function(){ }; //私有方法 return new function(){
this.getVersion= function(){
return _version;
};
this.method = function(){
_method(); //调用私有方法
};
}; }); //普通示例:
angular.module('freefedService',[]).factory('myService',function(){
return {
getUser : function(){}
};
});provider
所有服务工厂都是由provider服务创建的,provide服务负责在运行时初始化这些提供者,provider函数接收两个参数:
name(字符串) 需要注册的服务名
aProvider(对象、函数)
- aProvider是函数,那么它会通过依赖注入被调用, 并且通过$get方法返回一个对象
angular.module('freefedService',[]).provider('myService',function(){
this.setUrl = function(){};
this.$get = function( $http ){ //依赖注入在此加入
return {
getUser : function(){}
};
};
});- aProvider是对象,要带有$get方法
angular.module('freefedService',[]).provider('myService',{
setUrl : function(){};
$get: function( $http ){ //依赖注入在此加入
return {
getUser : function(){}
};
};
});什么场景使用provider方式创建服务
如果希望在config函数中可以对服务进行配置,必须用provider()来定义服务,示例
demo.html <!doctype html>
<html ng-app="freefedApp">
<head>
<title>angular应用demo</title>
<script src="angular.js"></script>
<script src="service.js"></script>
<script src="app.js"></script>
</head>
<body>
<div ng-controller="userCtrl">
<div class="user-center">
<span class="user-icon"><img src="{{vm.user.pic}}" /></span>
<span class="user-name">{{vm.user.name}}</span>
</div>
</div>
</body>
</html>service.js angular.module('freefedService',[]).provider('userService',function(){
var baseUrl = 'http://dev.freefed.com'
this.setUrl = function( base ){ baseUrl = base || baseUrl; };
this.$get = function( $http ){ //依赖注入在此加入
return {
getUser : function(){
$http({
url : baseUrl + '/getUser.php'
});
}
};
};
}); app.js /*声明module*/
var module = angular.module('freefedApp',['freefedService']).
config('userServiceProvider',['userServiceProvider',function(userServiceProvider){
//当我们希望在应用开始前对service进行配置的时候就需要使用到provider()
userServiceProvider.baseUrl = 'http:://product.freefed.com';
}]); /*声明控制器*/
module.controller('userCtrl',['$scope','userService',function($scope,userService){
var vm = $scope.vm = $scope.vm || {};
vm.user = {};
//调用userService服务
userService. getUser();
}]);constant
可以将一个已存在的常量值注册为服务,通过注入引用到应用中,constant()接收两个参数:
name(字符串) 需要注册的常量名
value(值或对象) 需要注册的常量的值
angular.module('freefedApp',[]).constant('configService',{
//把后台系统所有接口,以及硬编码的文本等都全部提取到这里来统一配置
UPLOAD_ERROR_TIP : '文件上传失败',
UPLOAD_SUCCESS_TIP : '文件上传成功',
......
BASE_URL : 'http://prodoct.freefed.com/', api : {
login : '/login.php'
user : '/user.php'
.......
}
});value
如果通过provider的$get返回的是一个常量,那就没必要定义一个包含复杂功能的完成服务,可以直接通过value函数方便的定义一个服务,value()接收两个参数:
name(字符串) 需要注册的常量名
value(值或对象) 将这个值作为可注入的实例返回
angular.module('freefedApp',[]).value('my',{
mytext : 'freefed welcome to you',
change : function(){}
});value()与constant()的区别
通过constant()声明的常量可以直接注入到配置函数中,通过value()声明的则不行,如下:
//constant()
angular.module('freefedConfig',[]).constant('apikey','kly78hjqp1k3b');
angular.module('freefedApp',['freefedConfig']).config( ['apikey',funciton( apikey ){
var key = apikey; //可以正常访问到常量apikey的值
}] ); //value()
angular.module('freefedConfig',[]).value('apikey','kly78hjqp1k3b');
angular.module('freefedApp',['freefedConfig']).value( ['apikey',funciton( apikey ){
//将会抛出错误, 未知的 provider : apikey ,因为在config函数内部无法访问这个值
}] );通常用value()来注册服务对象,用constant()来配置数据
angularJS中如何写服务的更多相关文章
- 【AngularJS中的自定义服务service VS factory VS provider】---它们的区别,你知道么?
在介绍AngularJS自定义服务之前,我们先来了解一下AngularJS~ 学过HTML的人都知道,HTML是一门很好的伪静态文本展示设计的声明式语言,但是,要构建WEB应用的话它就显得乏力了. 而 ...
- AngularJS中实现日志服务
本篇体验使用AngularJS自定义一个记录日志的服务. 在AngularJS中,服务的一些写法是这样的: var app = angular.module('app',[]); app.provid ...
- angularJS中如何写控制器
angularJS中的控制器是一个函数,用来向视图作用域中添加额外的功能,我们用它来给作用域对象设置初始状态,并添加自定义行为 当我们在页面上创建一个新的控制器时,angularJS会生成并传递一个新 ...
- angularJS中如何写自定义指令
指令定义 对于指令,可以把它简单的理解成在特定DOM元素上运行的函数,指令可以扩展这个元素的功能 例如,ng-click可以让一个元素能够监听click事件,并在接收到事件的时候执行angularJS ...
- AngularJS中的http服务的简单用法
我们可以使用内置的$http服务直接同外部进行通信.$http服务只是简单的封装了浏览器原生的XMLHttpRequest对象. 1.链式调用 $http服务是只能接受一个参数的函数,这个参数是一个对 ...
- 自定义AngularJS中的services服务
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- AngularJs中的服务
一.angularJs中的简单服务应用 下面的例子让我们明白在AngularJs中如何去调用文件中的数据,从而将文件中的数据显示在页面上;改变url的地址,也可以去调用后台接口. 实例: <!D ...
- AngularJS 中的Promise --- $q服务详解
先说说什么是Promise,什么是$q吧.Promise是一种异步处理模式,有很多的实现方式,比如著名的Kris Kwal's Q还有JQuery的Deffered. 什么是Promise 以前了解过 ...
- 怎么理解angularjs中的服务?
AngularJS中的服务其实就是提供一种方式抽取共用类库 比如说一些工具类方法,我们传统的做法就是自己写个 utility 类,把相关的工具方法填充到utility里面去,最后把utility类放到 ...
随机推荐
- (转载)php数组删除元素各种方法总结
(转载)http://www.111cn.net/phper/php/46865.htm 有很多朋友都不知道怎么把数组中元素给删除,下面我来总结各种数组删除元素方法给各位,有需要了解的朋友可进入参考. ...
- 关于aspx 页面生成html 源码顶部空行不得不说的事儿
原文引用自 http://www.360doc.com/content/12/0910/21/10504424_235418578.shtml 使用.aspx生成的页面一般都会有一个或多个空行,当然这 ...
- Ubuntu下安装Skyeye
ubuntu12下安装skyeye1.3.2 1.首先安装skyeye的依赖包,比如gtk的依赖,一般Ubuntu 都默认安装了,稳妥起见,运行下面的代码: sudo apt-get install ...
- JavaScript中bind、call、apply函数用法详解
在给我们项目组的其他程序介绍 js 的时候,我准备了很多的内容,但看起来效果不大,果然光讲还是不行的,必须动手.前几天有人问我关于代码里 call() 函数的用法,我让他去看书,这里推荐用js 写服务 ...
- npm常用命令总结
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: rgba(2 ...
- HDU--杭电--1253--胜利大逃亡--广搜
胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- 一起学android之怎样获取手机程序列表以及程序相关信息并启动指定程序 (26)
效果图: 程序列表: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFpX3FpbmdfeHVfa29uZw==/font/5a6L5L2T/fonts ...
- QT的信号与槽机制介绍
信号与槽作为QT的核心机制在QT编程中有着广泛的应用,本文介绍了信号与槽的一些基本概念.元对象工具以及在实际使用过程中应注意的一些问题. QT是一个跨平台的C++ GUI应用构架,它提供了丰富的窗 ...
- GIT使用指南
安装git,svn,ant,maven并配置环境变量 1.拷贝settings.xml到用户目录的.m2目录下. 2.打开git命令行,使用如下命令生成公钥私钥 ssh-keygen -t rsa 3 ...
- http状态码对应表
http状态码 1**:请求收到,继续处理 2**:操作成功收到,分析.接受 3**:完成此请求必须进一步处理 4**:请求包含一个错误语法或不能完成 5**:服务器执行一个完全有效请求失败 100— ...