AngularJS1.X学习笔记11-服务
如果我没记错的话,spring里边有个service层。什么是服务呢?个人理解就是很多地方要用的,可以跨越控制器甚至是跨越模块的工具。AngularJS也为我们提供了服务这种机制,这让我们可以将一些不属于某个控制器独有的东西定义成一个服务,要用的时候直接拿过来就好。使用服务有什么好处呢?一是便于统一修改,二是调用者不用关心内部实现,三是便于测试。
一、factory
<!DOCTYPE html>
<html lang="en" ng-app='myApp'>
<head>
<meta charset="UTF-8">
<title>factory</title>
</head>
<body>
<div ng-controller="dayCtrl"></div>
<div ng-controller="secondCtrl"></div> <script type="text/javascript" src="../node_modules/angular/angular.min.js"></script>
<script type="text/javascript">
var myApp = angular.module("myApp",[]);
myApp.controller('dayCtrl',function($scope,logService){
logService.log("dayCtrl exec"); })
.factory('logService',function(){
var messageCount = 0;
return {
log: function(msg){
console.log("LOG"+messageCount++ +":"+msg);
}
}
})
.controller("secondCtrl",function(logService){
logService.log("secondCtrl exec");
})
</script>
</body>
</html>
本例中我们用factory方法创建了一个服务,factory方法接受俩个参数,第一个表示服务名字,第二个是一个工厂函数,该函数返回一个对象,在对象中可以暴露服务 的方法。注意服务是单例的,正是因为如此,我们上面的服务才能够正确计数。调用自定义服务的方法和调用内置服务的方法是相同的,也是使用依赖注入。
二、service
service的使用方法和factory方法有所区别,他的第二个参数是一个构造器(或者叫构造函数)。
<!DOCTYPE html>
<html lang="en" ng-app='myApp'>
<head>
<meta charset="UTF-8">
<title>service</title>
</head>
<body>
<div ng-controller="dayCtrl"></div>
<div ng-controller="secondCtrl"></div> <script type="text/javascript" src="../node_modules/angular/angular.min.js"></script>
<script type="text/javascript">
var myApp = angular.module("myApp",[]);
function BaseLogger(){
this.messageCount = 0;
this.log = function(msg){
console.log(this.messageType+":"+this.messageCount++ +":"+msg);
}
} function DebugLogger(){};
DebugLogger.prototype = new BaseLogger();
DebugLogger.prototype.messageType="Debug"; function ErrorLogger(){};
ErrorLogger.prototype = new BaseLogger();
ErrorLogger.prototype.messageType = "Error"; myApp.controller('dayCtrl',function($scope,logService){
logService.log("dayCtrl exec"); })
.service("logService",DebugLogger)
.service("errorService",ErrorLogger)
.controller("secondCtrl",function(errorService){
errorService.log("secondCtrl exec");
})
</script>
</body>
</html>
其实,service也可以当作facrory用
<!DOCTYPE html>
<html lang="en" ng-app='myApp'>
<head>
<meta charset="UTF-8">
<title>factory</title>
</head>
<body>
<div ng-controller="dayCtrl"></div>
<div ng-controller="secondCtrl"></div> <script type="text/javascript" src="../node_modules/angular/angular.min.js"></script>
<script type="text/javascript">
var myApp = angular.module("myApp",[]);
myApp.controller('dayCtrl',function($scope,logService){
logService.log("dayCtrl exec"); })
.service('logService',function(){
var messageCount = 0;
return {
log: function(msg){
console.log("LOG"+messageCount++ +":"+msg);
}
}
})
.controller("secondCtrl",function(logService){
logService.log("secondCtrl exec");
})
</script>
</body>
</html>
这样做是没有问题的。
三、provider
provider方法可以让你更好地控制被创建或被配置的服务对象的方式。
<!DOCTYPE html>
<html lang="en" ng-app='myApp'>
<head>
<meta charset="UTF-8">
<title>provider</title>
</head>
<body>
<div ng-controller="dayCtrl"></div> <script type="text/javascript" src="../node_modules/angular/angular.min.js"></script>
<script type="text/javascript">
var myApp = angular.module("myApp",[]);
myApp
.config(function(logServiceProvider){
logServiceProvider.debugEnabled(false);
})
.controller('dayCtrl',function($scope,logService){
logService.log("dayCtrl exec"); })
.provider('logService',function(){
var debug = true;
return {
debugEnabled:function(setting){
if(angular.isDefined(setting)){
debug = setting;
return this;
}else{
return debug;
}
}, $get:function(){
return {
messageCount:0,
log:function(msg){
if(debug){
console.log("LOG"+this.messageCount++ +":"+msg);
} }
}
}
} })
</script>
</body>
</html>
provider非常强大,可以通过config对我们的服务进行配置。上例中提供了debugEnabled方法,可以对是否记录日志进行配置。实质上,看看源码就会知道就可以知道service和factory方法都是provider方法的特殊形式。
看到没,factory是调用的provider,service是调用的factory,所以说service和factory都是provider,他们可以做的provider也可以做。
四、内置服务
这里引用一下(请参考:http://www.cnblogs.com/best/p/6263915.html)
$http 发送http请求
$resource 创建一个可以RESTful服务器端数据源交互对象
$window 浏览器的window元素的jQuery包装
$document 浏览器的document元素的jQuery包装
$rootScope 根作用域的访问
$rootElement 根元素的访问
$cacheFactory 提供键/值对放置到对象缓存
$interval 提供对window.setInterval访问
$timeout 提供对window.setTimeout访问
$cookies 提供对浏览器的cookie的读写访问
$animate 提供动画钩子来同时链接到以CSS和JavaScript为基础的动画
好了,关于服务就先到这了,今天必须把ajax和路由看完。加油加油!
AngularJS1.X学习笔记11-服务的更多相关文章
- Ext.Net学习笔记11:Ext.Net GridPanel的用法
Ext.Net学习笔记11:Ext.Net GridPanel的用法 GridPanel是用来显示数据的表格,与ASP.NET中的GridView类似. GridPanel用法 直接看代码: < ...
- SQL反模式学习笔记11 限定列的有效值
目标:限定列的有效值,将一列的有效字段值约束在一个固定的集合中.类似于数据字典. 反模式:在列定义上指定可选值 1. 对某一列定义一个检查约束项,这个约束不允许往列中插入或者更新任何会导致约束失败的值 ...
- golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好
golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好 jetbrain家的全套ide都很好用,一定要dark背景风格才装B 从File-->s ...
- Spring MVC 学习笔记11 —— 后端返回json格式数据
Spring MVC 学习笔记11 -- 后端返回json格式数据 我们常常听说json数据,首先,什么是json数据,总结起来,有以下几点: 1. JSON的全称是"JavaScript ...
- Python3+Selenium3+webdriver学习笔记11(cookie处理)
#!/usr/bin/env python# -*- coding:utf-8 -*-'''Selenium3+webdriver学习笔记11(cookie处理)'''from selenium im ...
- 并发编程学习笔记(11)----FutureTask的使用及实现
1. Future的使用 Future模式解决的问题是.在实际的运用场景中,可能某一个任务执行起来非常耗时,如果我们线程一直等着该任务执行完成再去执行其他的代码,就会损耗很大的性能,而Future接口 ...
- 《C++ Primer Plus》学习笔记11
<C++ Primer Plus>学习笔记11 第17章 输入.输出和文件 <<<<<<<<<<<<<< ...
- SpringCloud学习笔记:服务支撑组件
SpringCloud学习笔记:服务支撑组件 服务支撑组件 在微服务的演进过程中,为了最大化利用微服务的优势,保障系统的高可用性,需要通过一些服务支撑组件来协助服务间有效的协作.各个服务支撑组件的原理 ...
- SpringMVC:学习笔记(11)——依赖注入与@Autowired
SpringMVC:学习笔记(11)——依赖注入与@Autowired 使用@Autowired 从Spring2.5开始,它引入了一种全新的依赖注入方式,即通过@Autowired注解.这个注解允许 ...
- Spring 源码学习笔记11——Spring事务
Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...
随机推荐
- SQL添加表字段
通用式: alter table [表名] add [字段名] 字段属性 default 缺省值 default 是可选参数 增加字段: alter table [表名] add 字段名 smalli ...
- vue.js 视频播放
最近心学习vue.js开发,video开发播放! 使用第三方的封装:https://www.npmjs.com/package/vue-video-player: 1. npm install vue ...
- Python功能键
swapcase ,大小写翻转 title,每个单词首字母大写 upper,全部大写 lower,全小写 center,居中(可填充符号) lstrip,去除首尾空格斜杠符号 find,寻找出现的位数 ...
- parted分区及挂载实战操作大全
个人原创博客,转载请注明,否则要负法律责任 2017-09-29-14:46:25[root@localhost ~]# df -hFilesystem Size Used Avail Use% Mo ...
- redis分片和哨兵
1 Redis的使用 1.1 Redis入门案例 1.1.1 什么样的数据使用缓存 说明:使用缓存其实为了减少用户查询数据库的时间.如果数据频繁的变更.不适用缓存.缓存中的数据应该保存修改频率不高的数 ...
- 基于hi-nginx的web开发(python篇)——表单处理和文件上传
hi-nginx会自动处理表单,所以,在hi.py框架里,要做的就是直接使用这些数据. 表单数据一般用GET和POST方法提交.hi-nginx会把这些数据解析出来,放在form成员变量里.对pyth ...
- 基于jquery的插件开发
最近在公司做一个项目,由于后台数据太多需要分页显示,在网上找了很多插件都没有找到合适的分页插件,所有的分页插件始终达不到自己想要的效果.由于这个项目也不是很赶,就在网上查找各种资料,自己写一个基于jq ...
- Sticks Problem
Sticks Problem poj-2452 题目大意:给你一串n个数的数列a,上面的数为a1到an.我们求最大的y-x,其中,y和x满足1.x<y 2.任意的x<i<y,都有ai ...
- 记一次sqoop同步到mysql
工作中需要用到将hive的数据导一份到mysql中,需求是这样的:hive每天会产生一份用户标签(tag)发生变化的结果表user_tag,这份结果同步到mysql中,并且保持一份全量表,存储当前用户 ...
- [活动] 【奖品撩人】部落守卫者集结令·这一回同程SRC的安全由“我”守卫!
i春秋SRC部落联合同程SRC发布首届部落守卫者漏洞提交任务(代号G001)! 你准备好了吗! [部落守卫者集结令]拿巨额奖金?上白帽子排行榜?近距离膜拜大佬?学技术?掌握窍门?又或者你是个责任感爆棚 ...